标签:
5 3 15
1 5
2 5
3 5
4 5
5 5
1 5
2 4
3 3
10
对样例的解释
当W 选4 的时候,三个区间上检验值分别为 20、5 、0 ,这批矿产的检验结果为 25,此时与标准值S 相差最小为10。
#include <iostream> #include<cstdio> #include <algorithm> #include <cstring> using namespace std; const int N=200005; int n,m; int w[N],v[N],l[N],r[N]; int lw=0,rw=-1; long long s,ans=1LL<<60; long long sw[200005]; //s w int sc[200005]; //s count long long check(int ww){ memset(sw,0,sizeof(sw)); memset(sc,0,sizeof(sc)); for(int i=1;i<=n;i++){ //pre if(w[i]>=ww){ sw[i]=sw[i-1]+v[i]; sc[i]=sc[i-1]+1; }else{ sw[i]=sw[i-1]; sc[i]=sc[i-1]; } } long long y=0; for(int i=0;i<m;i++){ y+=(sc[r[i]]-sc[l[i]-1])*(sw[r[i]]-sw[l[i]-1]); } return y; } int main() { scanf("%d%d%lld",&n,&m,&s); for(int i=1;i<=n;i++){ scanf("%d%d",&w[i],&v[i]); rw=max(rw,w[i]); } for(int i=0;i<m;i++) scanf("%d%d",&l[i],&r[i]); lw=0; rw++; while (lw<=rw){ int mid=(lw+rw)>>1; long long y=check(mid); ans=min(ans,abs(y-s)); //update if(y<s) rw=mid-1; else lw=mid+1; } cout<<ans; return 0; }
标签:
原文地址:http://www.cnblogs.com/candy99/p/5754173.html