70pts求助
查看原帖
70pts求助
325983
mieeee楼主2023/11/1 17:27

测试点7,8,9,10,11,13未通过TAT

#include<iostream>
#include<cmath>
using namespace std;

int n,m;
long long s;
int w[200005],v[200005],l[200005],r[200005];
long long pre_n[20005],pre_v[200005];

long long calcu_y(int w0){
	long long y0=0;
	for(int i=1;i<=n;i++){//计算前缀和
		if(w[i]>w0){
			pre_n[i]=pre_n[i-1]+1;
			pre_v[i]=pre_v[i-1]+v[i];
		}else{
			pre_n[i]=pre_n[i-1];
			pre_v[i]=pre_v[i-1];
		}
	}
	for(int i=1;i<=m;i++){
		y0+=(pre_n[r[i]]-pre_n[l[i]-1])*(pre_v[r[i]]-pre_v[l[i]-1]);
	}
	return y0;
}

void DIGUI(int w1,int w2){//y关于W单调递减,w1<w2,y1>=s>y2
	if(w2-w1<=1){
		long long y1=calcu_y(w1),y2=calcu_y(w2);
		cout<<min(y1-s,s-y2);
		return;
	}
	int wmid=(w1+w2)/2;
	if(calcu_y(wmid)<s){
		DIGUI(w1,wmid);
	}else{
		DIGUI(wmid,w2);
	}
}

int main()
{
	cin>>n>>m>>s;
	for(int i=1;i<=n;i++){
		cin>>w[i]>>v[i];
	}
	for(int i=1;i<=m;i++){
		cin>>l[i]>>r[i];
	}
	int wmin=w[1],wmax=w[1];
	for(int i=2;i<=n;i++){
		if(w[i]<wmin)wmin=w[i];
		if(w[i]>wmax)wmax=w[i];
	}
	DIGUI(wmin,wmax+1);
	return 0;
}
2023/11/1 17:27
加载中...