求助:本地AC洛谷95
查看原帖
求助:本地AC洛谷95
279755
褚明阳楼主2021/10/21 19:37
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
long long cnt[200001][2];
int l[200001],r[200001],w[200001],v[200001];
int main()
{
	int n,m,L,R,mid;
	long long s,res,ans=__LONG_LONG_MAX__;
	scanf("%d%d%lld",&n,&m,&s);
	L=0;
	for(int i=1;i<=n;i++)
	{
		scanf("%d%d",w+i,v+i);
		R=max(R,w[i]);
	}
	for(int i=1;i<=m;i++)
		scanf("%d%d",l+i,r+i);
	while(L<R)
	{
		res=0;
		mid=(L+R)/2;
		for(int i=1;i<=n;i++)
			if(w[i]>=mid)
			{
				cnt[i][0]=cnt[i-1][0]+1;
				cnt[i][1]=cnt[i-1][1]+v[i];
			}
			else
			{
				cnt[i][0]=cnt[i-1][0];
				cnt[i][1]=cnt[i-1][1];
			}
		for(int i=1;i<=m;i++)
			res+=(cnt[r[i]][0]-cnt[l[i]-1][0])*(cnt[r[i]][1]-cnt[l[i]-1][1]);
		ans=min(ans,abs(res-s));
		if(res<s)
			R=mid;
		else
			L=mid+1;
	}
	printf("%lld",ans);
}
2021/10/21 19:37
加载中...