记录编号 | 468935 | 评测结果 | AAAAAAAAAAAAAAAAAAAA | ||
---|---|---|---|---|---|
题目名称 | [NOIP 2011]聪明的质监员 | 最终得分 | 100 | ||
用户昵称 | 是否通过 | 通过 | |||
代码语言 | C++ | 运行时间 | 0.534 s | ||
提交时间 | 2017-11-02 12:44:33 | 内存使用 | 6.39 MiB | ||
#include<cstdio> #include<algorithm> #define ll long long using namespace std; const int inf=200005; int n,m,w[inf],v[inf],l[inf],r[inf],Max=-1,ans1,ans2; ll S,s1[inf],s2[inf]; ll check(int x){ s1[0]=s2[0]=0; for(int i=1;i<=n;i++){ s1[i]=s1[i-1]; s2[i]=s2[i-1]; if(w[i]>=x){ s1[i]++;s2[i]+=v[i]; } } ll ans=0; for(int i=1;i<=m;i++){ ans+=(s1[r[i]]-s1[l[i]-1])*(s2[r[i]]-s2[l[i]-1]); } return ans; } int main() { freopen("qc.in","r",stdin); freopen("qc.out","w",stdout); scanf("%d%d%lld",&n,&m,&S); for(int i=1;i<=n;i++)scanf("%d%d",&w[i],&v[i]),Max=max(Max,w[i]); for(int i=1;i<=m;i++)scanf("%d%d",&l[i],&r[i]); int l=0,r=Max; while(l!=r){ int mid=(l+r)>>1; if(check(mid)>S)l=mid+1; else r=mid; }ans1=l; l=0,r=Max; while(l!=r){ int mid=((l+r)>>1)+1; if(check(mid)<S)r=mid-1; else l=mid; }ans2=l; printf("%lld\n",min(abs(check(ans1)-S),abs(check(ans2)-S))); return 0; }