我是題面
讀完題後,我們會發現這道題的題意非常簡單,大意就是有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 的時間內多個條件,有時候可以先假裝二分過了去想題,發現不用二分再把二分去掉。但是再算一算,只加上二...