洛谷P1314 聪明的质监员
2017-10-22 08:51
225 查看
P1314 聪明的质监员
题目描述
小T 是一名质量监督员,最近负责检验一批矿产的质量。这批矿产共有 n 个矿石,从 1到n 逐一编号,每个矿石都有自己的重量 wi 以及价值vi 。检验矿产的流程是:1 、给定m 个区间[Li,Ri];
2 、选出一个参数 W;
3 、对于一个区间[Li,Ri],计算矿石在这个区间上的检验值Yi:
#include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #define maxn 200010 #ifdef WIN32 #define LL "%I64d" #else #define LL "%lld" #endif using namespace std; int n,m,w[maxn],v[maxn],L[maxn],R[maxn]; long long sum[maxn][2]; long long s; long long check(int x){ memset(sum,0,sizeof(sum)); for(int i=1;i<=n;i++){ if(w[i]>=x){ sum[i][0]=sum[i-1][0]+1; sum[i][1]=sum[i-1][1]+v[i]; } else{ sum[i][0]=sum[i-1][0]; sum[i][1]=sum[i-1][1]; } } long long res=0; for(int i=1;i<=m;i++) res+=(sum[R[i]][0]-sum[L[i]-1][0])*(sum[R[i]][1]-sum[L[i]-1][1]); return res; } int main(){ freopen("Cola.txt","r",stdin); scanf("%d%d"LL,&n,&m,&s); int l=0x7fffffff,r=0; for(int i=1;i<=n;i++){ scanf("%d%d",&w[i],&v[i]); l=min(l,w[i]);r=max(r,w[i]); } for(int i=1;i<=m;i++)scanf("%d%d",&L[i],&R[i]); long long ans=1e12; while(l<=r){ int mid=(l+r)>>1; long long now=check(mid); ans=min(ans,abs(now-s)); if(now>s)l=mid+1; else r=mid-1; } printf(LL,ans); }
100分 二分答案+前缀和
相关文章推荐
- AC日记——聪明的质监员 洛谷 P1314
- 洛谷 P1314 聪明的质监员
- 洛谷 P1314 聪明的质监员【二分+前缀和】
- 洛谷P1314 [NOIP2011提高组Day2T2] 聪明的质监员
- 洛谷 P1314 聪明的质监员
- [NOIP2011] 提高组 洛谷P1314 聪明的质监员
- 洛谷 P1314 [NOIP2011 D2T2] 聪明的质监员
- 洛谷——P1314 聪明的质监员
- 洛谷1314 聪明的质监员
- P1314 聪明的质监员
- 洛谷 P1314 聪明的质检员
- P1314 聪明的质监员
- 二分查找前缀和(洛谷1314聪明的质监员NOIP2011提高组)
- P1314 聪明的质监员
- 洛谷1314 聪明的质监员
- 洛谷 [P1314] 聪明的质检员(NOIP2011 D2T2)
- 【二分答案】NOIP2011day2聪明的质监员
- NOIP2011 聪明的质监员
- 聪明的质监员(codevs 1138)
- [NOIP2011] 聪明的质监员