65pts,求调。(悲
查看原帖
65pts,求调。(悲
1059321
NPH_Zhao楼主2023/8/14 23:32
#include <bits/stdc++.h>
#define int long long

using namespace std;

const int MAXN = 2e5 + 5;
int n, m, s, w[MAXN], v[MAXN];
int _max = INT_MIN, _min = INT_MAX, l, r;
int presumv[MAXN], presum[MAXN];
int L[MAXN], R[MAXN];
int sum = 0, ans = INT_MAX;

signed main(){
    cin >> n >> m >> s;
    for(int i = 1; i <= n; i ++){
        cin >> w[i] >> v[i];
        _max = max(_max, w[i]);
        _min = min(_min, w[i]);
    }
    for(int i = 1; i <= m; i ++){
        cin >> L[i] >> R[i];
    }
    int l = _min, r = _max;
    while(l <= r){
        int mid = l + ((r - l) >> 1);
        sum = 0;
        memset(presumv, 0, sizeof(presumv));
        memset(presum, 0, sizeof(presum));
        for(int i = 1; i <= n; i ++){
            if(w[i] >= mid){
                presumv[i] = presumv[i - 1] + v[i];
                presum[i] = presum[i - 1] + 1;
            }
            else{
                presumv[i] = presumv[i - 1];
                presum[i] = presum[i - 1];
            }
        }
        for(int i = 1; i <= m; i ++){
            sum += ((presum[R[i]] - presum[L[i] - 1]) * (presumv[R[i]] - presumv[L[i] - 1]));
        }
        if(sum > s) l = mid + 1;
        else if(sum == s){
            cout << 0 << endl;
            return 0;
        }
        else r = mid - 1;
        if(abs(sum - s) < ans) ans = abs(sum - s);
    }
    cout << ans << endl;
    return 0;
}
2023/8/14 23:32
加载中...