比赛 聪明的工作员 评测结果 AAAAWWWWWWWWWWWWWWWW
题目名称 聪明的质监员 最终得分 20
用户昵称 Hyoi_0Koto 运行时间 1.214 s
代码语言 C++ 内存使用 4.89 MiB
提交时间 2017-03-21 20:10:02
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cmath>
#define maxn 200001
using namespace std;
int n,m,w,l,r,maxw,now;
long long S,j,k;
struct Request{
	int l;
	int r;
}request[maxn];
int W[maxn],v[maxn],sum[maxn],ans[maxn];
void getsum(int w)
{
	sum[1]=(W[1]>w)?1:0;
	for(int i=2;i<=n;i++)
	{
		if(W[i]>=w)
			sum[i]=sum[i-1]+1;
		else
			sum[i]=sum[i-1];
	}
}
void getans(int w)
{
	ans[1]=(W[1]>w)?v[1]:0;
	for(int i=2;i<=n;i++)
	{
		if(W[i]>=w)
			ans[i]=ans[i-1]+v[i];
		else
			ans[i]=ans[i-1];
	}
}
long long gety(int w)
{
	getsum(w);
	getans(w);
	long long s=0;
	for(int i=1;i<=m;i++)
	{
		int x=request[i].l;
		int y=request[i].r;
		s+=(sum[y]-sum[x-1])*(ans[y]-ans[x-1]);
	}
	return s;
}
void input(){
	cin>>n>>m>>S;
	maxw=-1;
	for(int i=1;i<=n;i++)
	{
		cin>>W[i]>>v[i];
		if(maxw<W[i])
			maxw=W[i];
	}
	for(int i=1;i<=m;i++)
		cin>>request[i].l>>request[i].r;
	w=maxw;
	l=1,r=w;
}
int divide(int l,int r){
	w=(l+r)/2;
	now=gety(w);
	if(now>S)
		{
			if(r==w||r==w+1)
			{
				if(w+1<=maxw)
				{
					j=gety(w+1);
					j=abs(S-j);
					k=abs(S-now);
					return ((j<k)?j:k);
				}
				else
				    return abs(S-now);
			}
			divide(w,r);
		}
		else if(now<S)
		{
			if(l==w||w==l+1)
			{
				if(w-1>=1)
				{
					j=gety(w-1);
					j=abs(S-j);
					k=abs(S-now);
					return ((j<k)?j:k);
				}
				else
					return abs(S-now);
			}
			divide(l,w);
		}
		else
		{
			return 0;
		}
}
int main()
{
	freopen("qc.in","r",stdin);
	freopen("qc.out","w",stdout);
	input();
	cout<<divide(l,r);	
	return 0;
}