聪明的质监员

初始化用 long long 的最大值  9223372036854775807

如果用 int 的最大值 2147483647 只有65分

#include <iostream>
#include <cstdio>
#define LL long long
LL read()
{
	LL x=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9')
	{
		if(c=='-')  f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9')
	{
		x=x*10+c-'0';
		c=getchar();
	}
	return f*x;
}
const int N=300000;
LL n,m,s,w[N],v[N],L[N],R[N],l=9223372036854775807,r=0;
LL num[N],sum[N],ans=9223372036854775807,val;
LL max(LL a,LL b)
{
	if(a>b)  return a;
	return b;
}
LL min(LL a,LL b)
{
	if(a<b)  return a;
	return b;
}
LL abs(LL a)
{
	if(a>0)  return a;
	return -a;
}
int main()
{
	n=read();  m=read();  s=read();
	for(int i=1;i<=n;i++)  {
		w[i]=read();  v[i]=read();
		l=min(l,w[i]);  r=max(r,w[i]);
	}
	for(int i=1;i<=m;i++)  {
		L[i]=read();  R[i]=read();
	}
	while(l<=r)
	{
		LL mid=(l+r)>>1;
		num[0]=0;  sum[0]=0;  val=0;
		for(int i=1;i<=n;i++)
		{
			num[i]=num[i-1];
			sum[i]=sum[i-1];
			if(w[i]>=mid)
			{
				num[i]++;
				sum[i]+=v[i];
			}
		}
		for(int i=1;i<=m;i++)
		  val+=(num[R[i]]-num[L[i]-1])*(sum[R[i]]-sum[L[i]-1]);
		ans=min(ans,abs(val-s));
		if(val>s)  l=mid+1;
		else       r=mid-1;
	}
	std::cout<<ans;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_42192786/article/details/88681835