NOIP提高组2011 聪明的质检员
2016-11-01 19:23
295 查看
二分答案+前缀和优化。 注意INF要开的大一点........ #include<cstdio> #include<cmath> using namespace std; #define LL long long const LL N=222222; const LL INF=12345678912340; struct Node { LL l; LL r; }a ; LL wei ,num ,v ,w ; LL n,m,S,r,l,mid,now,as; LL max(LL A,LL B) { return A>B? A:B; } LL min(LL A,LL B) { return A>B? B:A; } LL W(LL k) { wei[0]=0;num[0]=0; for (LL i=1;i<=n;i++) if (w[i]>=k) num[i]=num[i-1]+1,wei[i]=wei[i-1]+v[i]; else num[i]=num[i-1],wei[i]=wei[i-1]; LL sum=0; for (LL i=1;i<=m;i++) sum=sum+(wei[a[i].r]-wei[a[i].l-1])*(num[a[i].r]-num[a[i].l-1]); return S-sum; } int main() { scanf("%lld%lld%lld",&n,&m,&S); r=-INF; l=INF; for (LL i=1;i<=n;i++) scanf("%lld%lld",&w[i],&v[i]),l=min(l,w[i]),r=max(r,w[i]); for (LL i=1;i<=m;i++) scanf("%lld%lld",&a[i].l,&a[i].r); as=INF; while (l<=r) { mid=(l+r)>>1; now=W(mid); as=min(as,abs(now)); if (now<0) l=mid+1; else if (now>0) r=mid-1; else { as=0; break; } } printf("%lld",as); return 0; }
相关文章推荐
- NOIP2011提高组 聪明的质检员
- noip2011提高组——聪明的质检员
- NOIP2011提高组 聪明的质检员(重庆一中高2018级信息学竞赛测验6) 解题报告
- NOIP2011提高组 聪明的质检员(二分答案)
- 【NOIP2011提高组】聪明的质检员
- NOIP 2011 - 提高组 聪明的质检员 二分+前缀和 重庆一中高2018级竞赛班第六次测试 2016.7.31 Problem 2
- Noip 提高组 2011 Day2 T2 聪明的质检员 二分法
- 【NOIP2011】聪明的质检员 二分
- 洛谷 1314||NOIP 2011 聪明的质检员 二分 解题报告
- [NOIP 2011] 聪明的质检员
- NOIP 2011 提高组 聪明的质监员
- NOIP2011 聪明的质检员 题解
- 洛谷 [P1314] 聪明的质检员(NOIP2011 D2T2)
- NOIP2011复赛提高组day2(A:计算系数 B:聪明的质监员 C:观光公交)
- NOIP2011 D2 T2 聪明的质检员
- 【NOIP2011】聪明的质检员
- NOIP2011 聪明的质检员 二分
- NOIP2011提高组 聪明的质监员 -SilverN
- 【NOIP2011提高组T5】聪明的质监员-二分答案+前缀和
- [NOIP 2011] 聪明的质检员:二分,前缀和