首先我們得先知道乙個小結論, 就是說如果最優方案中最大值和最小值必定是在區間兩端
要麼就是這兩個數在長度為 \(l\) 的區間中
那麼我們用 st表處理出長度為 \(l\) 的區間中最優的答案
接下來處理兩個數在區間首尾的方案
假設區間右端是最大值, 左端是最小值
左端最大右端最小把陣列 \(reverse\) 一下就行
考慮用上分數規劃那套分析方法
\[\displaystyle\begin\frac&\geq ans\\m(l, r) - m(l, r) &\geq (r - l + k) * ans\\(m(l, r) - r * ans) - (m(l, r) - l * ans) &\geq k * ans\\\end
\]如果確定了 \(ans\) , 那麼左邊的 \(m(l, r) - r * ans\) 就是關於位置 \(r\) 的乙個定值
發現這個東西可以單調佇列
做完了, 二分一下這個 \(ans\) 就行
#include #include #include #include #include const int n = 50005;
const double eps = 1e-6;
using namespace std;
int t, n, m, l, r, a[n], f[2][15][n], q[n];
double res, ans, b[n];
template < typename t >
inline t read()
while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x * w;
}void getst()
}int query(int opt, int l, int r)
bool check(double mid)
return flag;
}void clear()
int main()
res = max(res, ans);
reverse(a + 1, a + n + 1);
l = 0, r = 1000;
while(fabs(r - l) > eps)
printf("%.4lf\n", max(res, ans));
}return 0;
}
送禮物 題解
這道題目是到毒瘤題。首先我們至少去l個,所以我們可以把小於l的用單調佇列直接求出。對取l r個。顯而易見的是左右兩端必分別是這個區間的最小值和最大值。我們可以用01分數規劃。不放令結果最後為ans,則有 a j ans j a i ans i ans k 所以我們就可以愉快地分數規劃啦。includ...
JSOI2015 染色問題 題解
傳送門 容斥原理 把三個容斥套一起 我們列舉至少有i ii行沒有染色,至少j jj列沒有染色,至少k kk種顏色沒有用到,那麼剩下 n i m j n i m j n i m j 個格仔每個都有c 1 k c 1 k c 1 k種選擇 可以在剩下c k c kc k種顏色中挑一種,也可以不染色 因此...
題解 JSOI2015染色問題
好像這個容斥還是明顯的。一共有三個要求,可以用組合數先滿足乙個,再用容斥解決剩下的兩個維。反正這題資料範圍這麼小,隨便亂搞都可以 用 a k i 表示使用 k 種顏色,至少有 i 列沒有染色的方案數,可以容斥預處理得到使用 k 種顏色染色使得每行每列均被染色的方案數。然後再容斥一下保證每種顏色都用上...