P1314 聰明的質監員

2022-03-13 05:07:31 字數 918 閱讀 3268

我是題面

讀完題後,我們會發現這道題的題意非常簡單,大意就是有n件物品,m個區間,求每個區間檢驗值之和,通過改變引數使標準值與檢驗值的差的絕對值最小

很明顯,檢驗值的變動只與引數有關,我們可以二分引數來搜尋答案

由題意可知,引數至小為0,至大為所有物品中最大的重量,再大則與至大值意義相同

那麼每次用字首和記錄當前引數下的\(\sum_j1\)值和\(\sum_jv_j\)值,來做到\(o(1)\)查詢區間

最後在每次二分中修改ans即可

下放**

#include#include#include#include#include#include#define ll long long

#define gc() getchar()

#define maxn 200005

using namespace std;

inline ll read()

while(isdigit(p))

return f?-a:a;

}void write(ll a)

int n,m,st,la,w[maxn],v[maxn],l[maxn],r[maxn];

ll s,sl[maxn],jz[maxn],ans; //sl陣列記錄滿足引數的數量,jz陣列記錄滿足引數的價值

bool check(ll x)

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

sum+=(sl[r[i]]-sl[l[i]-1])*(jz[r[i]]-jz[l[i]-1]); //可以做到對每個區間進行o(1)查詢

if(abs(s-sum)s; //若引數越小則檢驗值越大,反之越小

}int main()

write(ans);

return 0;

}

P1314 聰明的質監員

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

P1314 聰明的質監員

原題連線 首先題號好評qwq 1314 意思就是 我們要在第 i 個區間 li ri 裡找到所有的 j,使得 wj w,求出這些 j 的價值總和及符合條件的 j 的個數,那麼這個區間的貢獻就是這個價值總和乘上 j 的個數,然後我們要算所有區間的貢獻的總和 y 最後輸出 y s 的絕對值的最小值,其中...

P1314 聰明的質監員

p1314 聰明的質監員 這題還是挺有名的,然而是個假題 原因 但是它的思維方式還是挺重要的。思路 我們發現乙個w可以唯一確定乙個y,但是w不知道。像這種情況很容易想到二分。二分可以在 o log n 的時間內多個條件,有時候可以先假裝二分過了去想題,發現不用二分再把二分去掉。但是再算一算,只加上二...