记录编号 468935 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [NOIP 2011]聪明的质监员 最终得分 100
用户昵称 GravatarCSU_Turkey 是否通过 通过
代码语言 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;
}