題解 JSOI2015 送禮物

2022-05-07 22:12:11 字數 1228 閱讀 2254

首先我們得先知道乙個小結論, 就是說如果最優方案中最大值和最小值必定是在區間兩端

要麼就是這兩個數在長度為 \(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 種顏色染色使得每行每列均被染色的方案數。然後再容斥一下保證每種顏色都用上...