NOIP 2011 提高組 聰明的質監員

2021-08-13 23:04:38 字數 1324 閱讀 6563

二分+字首和:

因為w有已知範圍,即[min-1,max+1],且它會y隨著w的增大而減小,隨著w的減小而增大,所以顯然可以二分。

二分的時候區間肯定不能直接列舉了,對於乙個區間的求和以及滿足個數的求解,我們用2個字首和處理即可。

可能你們有人會想題目是|s-y|,那麼二分是否能保證最優呢?

實際上是可以的,當w使得y>s時,我們很顯然要增大w。

假設此時你減小了w,那麼y就會增大,即y-s增大了,注意,此時y>s,那麼|s-y|=y-s也增大了,顯然不優,所以向後二分。

而y < s時同理。

時間複雜度:o(log2k+n+m)

k為二分範圍,根據題意可知不超過10^6

#include

#include

#include

#include

#include

#define inf 0x7fffffff

#define n 200005

using namespace std;

typedef long long ll;

int rp[n], a[n], v[n], p[n], q[n], n, m;

ll sum[n], s, ans;

int main()

for (int i = 1; i <= m; i++)

scanf("%d

%d", &p[i], &q[i]);

ans = 0;

l--; r++;

while (l <= r)

}ll num = 0;

for (int i = 1; i <= m; i++)

num += (rp[q[i]] - rp[p[i] - 1]) * (sum[q[i]] - sum[p[i] - 1]);

if (ans > fabs(s - num) || ans == 0) ans = fabs(s - num);

if (num > s) l = mid + 1;

else r = mid - 1;

} printf("%lld",ans);

return

0;}

NOIP2011提高組 聰明的質監員

小 t 是一名質量監督員,最近負責檢驗一批礦產的質量。這批礦產共有n 個礦石,從1 到n 逐一編號,每個礦石都有自己的重量wi 以及價值vi。檢驗礦產的流程是 1 給定m 個區間 li,ri 2 選出乙個引數w 3 對於乙個區間 li,ri 計算礦石在這個區間上的檢驗值yi 這個區間上所有重量大於等...

noip2011提高組 聰明的質檢員

這道題要找乙個引數 這二分妥妥的。不然就t成翔吧。o o 每一次二分 都要預處理 cnt i 表示 對於當前二分到的引數 前 i 個有多少符合要求 sum i 表示 對於當前二分的引數 前 i 個符合要求的點的點權和 然後就按著題意來吧 找到 使結果比標準值小的 最靠近的那乙個 引數 再考慮這個引數...

NOIP2011提高組 聰明的質檢員

這道題很明顯要用二分猜答案,猜w的值,再來check。這裡我用的字首和的方法來check,求出前i個大於w 的個數和價值和,然後列舉每乙個區間,算就好了。注 要注意用longlong 考試的時候我就是這個錯了 具體程式如下 include include include include includ...