20分求天降大佬
查看原帖
20分求天降大佬
316533
why100楼主2024/10/2 16:29
#include<iostream>
#include<cstdio>
#include<algorithm> 
using namespace std;
int n,m,s,l[200010],r[200010],cnt[200010],w[200010];
long long sum[200010];
pair<int,int>a[200010];
void pre(int W)
{
	sum[0] = cnt[0] = 0;
	if(a[0].first >= W)
	{
		sum[0] = a[0].second;
		cnt[0]++;
	}
	for(int i = 1;i < n;i++)
	{
		sum[i] = sum[i-1];
		cnt[i] = cnt[i-1];
		if(a[i].first >= W)
		{
			sum[i] += a[i].second;
			cnt[i]++;
		}
	}
}
long long cn(int W)
{
	long long su = 0;
	pre(W);//打前缀表
	for(int i = 0;i < n;i++)
	{
		su += (cnt[r[i]]-cnt[l[i]-1])*(sum[r[i]]-sum[l[i]-1]);
	}
	return su;
}
void PR()
{
	for(int i = 0;i < n;i++)
	
	{
//		printf("%d ",sum[i]);
	}
//	cout << endl;
}
int main()
{
	scanf("%d %d %d",&n,&m,&s);
	for(int i = 0;i < n;i++)
	{
		scanf("%d %d",&a[i].first,&a[i].second);
		//w[i] = a[i].first;
	}
	for(int i = 0;i < m;i++)
	{
		scanf("%d %d",&l[i],&r[i]);
		l[i]--,r[i]--;
	}
	//sort(w,w+n);
	int l = 0,r = 1E6;
	long long anx = 0x3f3f3f3f3f3f3f3,anm = -0x3f;
	while(l <= r)
	{
		int m = (l+r)>>1;//二分W
		long long t = cn(m);//求分
		//PR();
		if(t > s)
		{
			l = m+1;
			anx = min(t,anx);
		}
		else if(t == s)
		{
			anm=anx=s;
			break;
		 } 
		else
		{
			anm = max(anm,t);
			r = m-1;
		}
	}
	long long ans;
	if((s-anm) > (anx-s))
	{
		ans = anx-s;
	}
	else
	{
		ans = s-anm;
	}
	cout <<ans;
	return 0;
}
2024/10/2 16:29
加载中...