30pts,玄关求调
查看原帖
30pts,玄关求调
785713
yzjznbQWQ楼主2024/9/14 21:41

rt

#include<bits/stdc++.h>

using namespace std;

#define ll long long
const int N = 200010;

inline int read(){
    int x=0,f=1;char c=getchar();
    for(;(c<'0'||c>'9');c=getchar()){if(c=='-')f=-1;}
    for(;(c>='0'&&c<='9');c=getchar())x=x*10+(c&15);
    return x*f;
}

ll n=read(),m=read(),s=read();
ll l[N],r[N],w[N],v[N],pre_w[N],pre_v[N];
ll y,sum;

bool check(ll W)
{
	y=0,sum=0;
	memset(pre_w,0,sizeof(pre_w));
	memset(pre_v,0,sizeof(pre_v));
	for(int i=1;i<=n;i++)
	{
		if(w[i]>=W) pre_w[i]=pre_w[i-1]+1,pre_v[i]=pre_v[i-1]+v[i];
		else pre_w[i]=pre_w[i-1],pre_v[i]=pre_v[i-1];
	}
	for(int i=1;i<=m;i++)
		y+=(pre_w[r[i]]-pre_w[l[i]-1])*(pre_v[r[i]]-pre_v[l[i]-1]);
	sum=llabs(y-s);
	if(y>s) return true;
	return false;	
}

ll wm=-1,wn=0x3f3f3f3f3f;

int main(){
	//freopen("P1314_2.in","r",stdin);
	for(int i=1;i<=n;i++) w[i]=read(),v[i]=read(),wn=min(wn,w[i]),wm=max(wm,w[i]);
	for(int i=1;i<=m;i++) l[i]=read(),r[i]=read();
//	w[0]=w[1],v[0]=v[1];
	ll left=wn-1,right=wm+2,mid;
	ll ans=0x3f3f3f3f3f3f3f3f;
	while(left<=right)
	{
		mid=(left+right)>>1;
		if(!check(mid)) right=mid-1;
		else left=mid+1;
		if(ans>=sum) ans=sum;
	}
	printf("%lld",ans);
	return 0;
} 
2024/9/14 21:41
加载中...