您的位置:首页 > 其它

洛谷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分 二分答案+前缀和
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: