求助:本地20 洛谷爆〇
查看原帖
求助:本地20 洛谷爆〇
122347
空____白楼主2021/11/14 18:04
#include<iostream>
#include<cmath>

using namespace std;
const int maxn=100001;
int dx=0x3f3f3f3f;
int l,r,mid;
int n,m,s;
int w[maxn],v[maxn],sp[maxn],ep[maxn];

bool check(int W)
{
	int ans1[maxn]={0},ans2[maxn]={0},ans[maxn]={0};
	for(int i=1;i<=n;i++)
	{
		if(w[i]>=W)
		{
			ans1[i]=ans1[i-1]+1;
			ans2[i]=ans2[i-1]+v[i];
		}
		else
		{
			ans1[i]=ans1[i-1];
			ans2[i]=ans2[i-1];
		}
	}
	for(int i=1;i<=m;i++)
	{
		ans[i] = (ans1[ep[i]]-ans1[sp[i]-1])*(ans2[ep[i]]-ans2[sp[i]-1]);//"-1"的位置 
	}
	int sum;
	for(int i=1;i<=m;i++)
	{
		sum+= ans[i];
	}
	dx=min(dx,abs(sum-s));

	if(sum>s)
		return 0;
	else 
		return 1;
}

int main()
{
	cin>>n>>m>>s;
	for(int i=1;i<=n;i++)
	{
		cin>>w[i]>>v[i];
		r=max(r,w[i]);
	}
	l=0;
	for(int i=1;i<=m;i++)
	{
		cin>>sp[i]>>ep[i];
	}
	while(l<=r)
	{
		mid=(l+r)/2;
		
		if(check(mid))
			r=mid-1;
		else 
			l=mid+1;	
	}
	cout<<dx<<endl;
}
2021/11/14 18:04
加载中...