【NOIP2011】聪明的质检员

xiaoxiao2021-02-28  28

本题乍一看,要对S-Y进行二分,仔细分析可知,应该对W进行二分。本题是二分答案的变体,S>Y时,应该r=mid-1;S=Y时,应该输出;S<Y时 应该l=mid+1;代码:

#include<iostream> #include<cstdio> #include<cstring> using namespace std; typedef long long ll; ll abs(ll x){ return (x>0)?x:(-x); } int n,m; ll S; int w[200001],v[200001]; int l[200001],r[200001]; ll val[200001],num[200001]; ll judge(int W){ for(int i=1;i<=n;i++){ if(w[i]>=W)val[i]=val[i-1]+v[i],num[i]=num[i-1]+1; else val[i]=val[i-1],num[i]=num[i-1]; } ll ans=0; for(int i=1;i<=m;i++){ ans+=(val[r[i]]-val[l[i]-1])*(num[r[i]]-num[l[i]-1]); } return ans; } int main(){ cin>>n>>m>>S; int minn=10e8,maxx=-10e8; for(int i=1;i<=n;i++){ cin>>w[i]>>v[i]; minn=min(minn,w[i]),maxx=max(maxx,w[i]); } for(int i=1;i<=m;i++){ cin>>l[i]>>r[i]; } int l=minn-1,r=maxx+1; ll ans=10e13; while(l<=r){ int mid=(l+r)>>1; ll tans=judge(mid); if(tans-S>0){ l=mid+1; } else{ r=mid-1; } ans=min(abs(tans-S),ans); } cout<<ans; return 0; }

转载请注明原文地址: https://www.6miu.com/read-2630309.html

最新回复(0)