70pts求助!
查看原帖
70pts求助!
1183187
sxhy楼主2024/4/13 11:40
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 7;
const int M = 47;
#define up(i,l,r) for(int i=l;i<=r;i++)
#define dn(i,l,r) for(int i=l;i>=r;i--)
long long n, m, g[N], s,vi[N],wi[N],li[N],ri[N],sv[N],sw[N];
long long ans=0,res=1e18;
inline long long  judge(long long  x) {
	memset(sv,0,sizeof(sv));
	memset(sw,0,sizeof(sw));
	long long tot = 0, y = 0;
	up(i, 1, n) {
		if (wi[i] >= x) {
			sw[i] = (sw[i - 1] + 1);
			sv[i] = (sv[i - 1] + vi[i]);
		}
		else {
			sw[i] = sw[i - 1];
			sv[i] = sv[i - 1];
		}
	}
	up(i, 1, m) {
		y += (sw[ri[i]] - sw[li[i] - 1]) * (sv[ri[i]] - sv[li[i] - 1]);
	}
	//res = min(abs(y-s),res);
	if (y - s >= 0)return 0;
	return 1;
}

int main() {
	long long ans1, ans2;
	cin >> n >> m >> s;
	up(i,1,n) {
		scanf("%lld%lld",&wi[i],&vi[i]);
		
	}
	up(i,1,m) {
		scanf("%lld%lld",&li[i], &ri[i]);
	}
	long long l = 0, r = 1e6,mid;
	while (l<=r) {
		mid = (l + r) / 2;
		if (judge(mid))r = mid - 1;
		else l = mid + 1;
	}
	memset(sv, 0, sizeof(sv));
	memset(sw, 0, sizeof(sw));
	long long tot = 0, y = 0;
	up(i, 1, n) {
		if (wi[i] >= r) {
			sw[i] = (sw[i - 1] + 1);
			sv[i] = (sv[i - 1] + vi[i]);
		}
		else {
			sw[i] = sw[i - 1];
			sv[i] = sv[i - 1];
		}
	}
	up(i, 1, m) {
		y += (sw[ri[i]] - sw[li[i] - 1]) * (sv[ri[i]] - sv[li[i] - 1]);
	}
	ans = abs(y - s);
	cout << ans;
}
2024/4/13 11:40
加载中...