P1314 [NOIP2011 提高组] 聪明的质监员
最大值最小-》二分
#include<cstdio> #include<iostream> #include<algorithm> //#include<queue> //#include<vector> #include<bits/stdc++.h> #define ll long long #define ddd printf("-----------------------\n"); using namespace std; const int maxn=2e5+10 ; struct node { ll v,w; }a[maxn]; ll s,pre_v[maxn],pre_w[maxn],sum,ans=0x3f3f3f3f3f3f3f3f,rgt,lft=0x3f3f3f3f3f3f3f3f; int n,m,l[maxn],r[maxn]; ll check(ll mid) { memset(pre_v,0,sizeof(pre_v)); memset(pre_w,0,sizeof(pre_w)); sum=0; for(int i=1;i<=n;i++){ if(a[i].w>=mid) { pre_w[i]=pre_w[i-1]+1; pre_v[i]=pre_v[i-1]+a[i].v; } else{ pre_w[i]=pre_w[i-1]; pre_v[i]=pre_v[i-1]; } } for(int i=1;i<=m;i++) sum+=(pre_v[r[i]]-pre_v[l[i]-1])*(pre_w[r[i]]-pre_w[l[i]-1]); ans=min(ans,abs(s-sum)); return sum>=s; } int main() { ios::sync_with_stdio(false); cin>>n>>m>>s; for(int i=1;i<=n;i++){ cin>>a[i].w>>a[i].v; rgt=max(a[i].w,rgt); lft=min(a[i].w,lft); } rgt+=2,lft-=1; for(int i=1;i<=m;i++){ cin>>l[i]>>r[i]; } while(lft<=rgt)// { ll mid=lft+rgt>>1; if(check(mid)) lft=mid+1; else rgt=mid-1; } cout<<ans<<'\n'; return 0; }

浙公网安备 33010602011771号