10分求调
查看原帖
10分求调
1232632
cclianlian楼主2024/7/13 10:30
using namespace std;
using ll = long long;
int n, m;
ll s,ans = 0x3f3f3f3f3f3f3f3;
struct kuanshi {
    ll w, v;
    kuanshi() {};
    kuanshi(ll a,ll b):w(a),v(b){}
};
struct interval {
    int l, r;
    interval() {}
    interval(int a,int b):l(a),r(b){}
};
vector<kuanshi>vec(200009, kuanshi());
vector<interval>inter(200009, interval());
ll prefix1[200009];
ll prefix2[200009];
bool isValid(int mid) {
    memset(prefix1, 0, sizeof(prefix1));
    memset(prefix2, 0, sizeof(prefix2));
    for (int i = 1; i <= n; i++) {
        if (vec[i].w >= mid) {
            prefix1[i] = prefix1[i - 1] + 1;
            prefix2[i] = prefix2[i - 1] + vec[i].v;
        }
        else {
            prefix1[i] = prefix1[i - 1];
            prefix2[i] = prefix2[i - 1];
        }
    }
    /*cout << "mid is " << mid;
    for (int i = 1; i <= n; i++) {
        cout << prefix1[i] << " ";
    }
    cout << endl;*/
    int l, r; ll sum = 0;
    for (int i = 1; i <= m; i++) {
        l = inter[i].l, r = inter[i].r;
        sum += (prefix1[r] - prefix1[l - 1]) * (prefix2[r] - prefix2[l - 1]);
    }
    ans = min(ans, abs(sum - s));
    if (sum > mid) {
        return false;
    }
    return true;
    
}
void solve() {
    cin >> n >> m >> s;
    ll mx = 0, mn = 0;
    for (int i = 1; i <= n; i++) {
        cin >> vec[i].w >> vec[i].v;
        mx = max(mx, vec[i].w);
        mn = min(mn, vec[i].w);
    }
    for (int i = 1; i <= m; i++) {
        cin >> inter[i].l >> inter[i].r;
    }
    int l=mn-1, r=mx+1, mid = 0;
    while(l <= r) {
        mid = (l + r) / 2;
        if (isValid(mid)) {
            r = mid - 1;
        }
        else {
            l = mid + 1;
        }
    }
    cout << ans;
}
signed main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(0); std::cout.tie(0);
    solve();
    return 0;
}
2024/7/13 10:30
加载中...