##求助,和第一篇题解对照很久找不到错
查看原帖
##求助,和第一篇题解对照很久找不到错
800062
zi_sha_le楼主2023/11/24 19:43
#include<bits/stdc++.h>
using namespace std;
const ll INF = 0x3f3f3f3f;
const ll mod = 9901;
const ll MAX = 200005;


ll n, m, s;
ll ans = 1e18+10;
ll w[MAX], v[MAX], l[MAX], r[MAX];
ll pv[MAX], pw[MAX];
bool check(int W) {
	memset(pv, 0, sizeof(pv));
	memset(pw, 0, sizeof(pw));
	for (int i = 1; i <= n; i++) {
		pw[i] = pw[i - 1];
		pv[i] = pv[i - 1];
		if (w[i] >= W) {
			pw[i] += v[i];
			pv[i]++;
		}
	}     
	ll now = 0;
	for (int i = 1; i <= n; i++) {
		now += (pw[r[i]] - pw[l[i]-1]) * (pv[r[i]] - pv[l[i]-1]);
	}
	//cout << now << endl;
	ans = min(ans, abs(now-s));
	return now - s > 0;
}
void solve() {
	cin >> n >> m >> s;ll maxa = -1, mina = 2147483647;
	for (int i = 1; i <= n; i++) {
		cin >> w[i] >> v[i];
		maxa = max(maxa, w[i]);
		mina = min(mina, w[i]);
	}
	for (int i = 1; i <= m; i++)cin >> l[i] >> r[i];
	mina -= 100; maxa += 200;
	while (mina < maxa) {
		ll mid = (mina + maxa)/2;
		//cout << mid <<" ";
		//cout << mina << " " << maxa << endl;
		if (check(mid))mina = mid + 1;
		else maxa = mid;
		
	}
	cout << ans;
}
int main() {
	ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);

	//int t; cin >> t;
	//while (t--)
	solve();

	return 0;
}
2023/11/24 19:43
加载中...