codevs 1138 聪明的质监员
2016-08-22 20:07
232 查看
二分+前缀和。
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #define maxn 200500 #define inf 0x7f7f7f7f7f7f7f7fll using namespace std; long long n,m,s,w[maxn],v[maxn],l[maxn],r[maxn],mx=0; long long s1[maxn],s2[maxn]; long long check(long long x) { long long ret1=0,ret2=0,kr=0; for (long long i=1;i<=n;i++) { if (w[i]>=x) {s1[i]=1;s2[i]=v[i];} else {s1[i]=0;s2[i]=0;} s1[i]+=s1[i-1];s2[i]+=s2[i-1]; } for (long long i=1;i<=m;i++) { ret1=(s1[r[i]]-s1[l[i]-1]); ret2=(s2[r[i]]-s2[l[i]-1]); kr+=ret1*ret2; } return kr; } long long get_ans() { long long l=1,r=mx,ans=inf; while (l<=r) { long long mid=(l+r)>>1; long long regis=check(mid); ans=min(ans,abs(s-regis)); if (regis<s) r=mid-1; else if (regis>s) l=mid+1; else {ans=0;break;} } return ans; } int main() { scanf("%lld%lld%lld",&n,&m,&s); for (long long i=1;i<=n;i++) { scanf("%lld%lld",&w[i],&v[i]); mx=max(mx,w[i]); } for (long long i=1;i<=m;i++) scanf("%lld%lld",&l[i],&r[i]); printf("%lld\n",get_ans()); return 0; }
相关文章推荐
- 聪明的质监员(codevs 1138)
- [Codevs] 1138 聪明的质监员
- Codevs 1138 聪明的质监员 2011年NOIP全国联赛提高组
- luoguP1314 codevs1138 聪明的质监员
- luoguP1314 codevs1138 聪明的质监员
- codevs 1138 聪明的质监员
- 聪明的质监员(codevs 1138)题解
- CODE[VS] 1138 聪明的质检员 二分+前缀和
- CODEVS 1138 聪明的质(张)检(全)员(蛋)
- codevs1113 聪明的质检员
- codevs 1733 聪明的打字员 (Bfs)
- 1138 聪明的质监员
- codevs 1138 聪明的质监员
- 使用VS Code从零开始开发调试.NET Core 1.1
- 【codevs1690】开关灯 线段树 区间修改+区间求和(标记)
- 用VsCode编辑TypeScript
- VS Code - Debugger for Chrome调试JavaScript的两种方式
- Codevs 3990 [中国剩余定理]
- [noip2011]聪明的质监员
- vscode编辑器golang调试