75pts求助
查看原帖
75pts求助
1124480
t202482楼主2023/10/29 09:07
#include <iostream>
#include <cstdio>
#include <cstring>
#include <climits>
using namespace std;

int w[200005], v[200005], l1[200005], r1[200005];
long long s, diff, min_diff=LONG_LONG_MAX, prefix[200005], prefix_v[200005], n, m;

inline int read() {
	int x=0; char ch=getchar();
	while(ch<'0' || ch>'9') ch=getchar();
	while(ch>='0' && ch<='9')
		x = (x<<3) + (x<<1) + ch-48, ch=getchar();
	return x;
}

bool check(int mid) {
	memset(prefix, 0, sizeof(prefix)), 
	memset(prefix_v, 0, sizeof(prefix_v)); 
	long long ans=0;
	
	for(int i=1; i<=n; ++i)
		prefix[i] = prefix[i-1] + (w[i] >= mid), 
		prefix_v[i] = prefix_v[i-1] + (w[i] >= mid)*v[i];
	for(int i=1; i<=m; ++i)
		ans += (prefix[r1[i]] - prefix[l1[i]-1]) * (prefix_v[r1[i]] - prefix_v[l1[i]-1]);
	
	diff = ans>s ? ans-s : s-ans; return ans<s;
}

int main() {
	n=read(), m=read(), cin >> s;
	int l=0, r=-1, mid;
	
	for(int i=1; i<=n; ++i)
		w[i] = read(), v[i] = read(),
		r = r<w[i] ? w[i] : r;
	for(int i=1; i<=m; ++i)
		l1[i] = read(), r1[i] = read();
	r+=2;
	
	while(l<r) {
		mid = (l+r) >> 1;
		if(check(mid)) r=mid-1; else l=mid+1;
		min_diff = diff<min_diff ? diff : min_diff;
	}
	cout << min_diff;
   return 0;
}
2023/10/29 09:07
加载中...