0分求调,样例过了
查看原帖
0分求调,样例过了
588080
n_bluetea楼主2024/6/24 23:16
#include<bits/stdc++.h>
using namespace std;

#define int long long
const int maxn = 1e6+10;

int n, m, s;
int w[maxn], v[maxn], l[maxn], r[maxn];
int pre_w[maxn], pre_v[maxn];

int check(int x){
    memset(pre_w,0,sizeof(pre_w));
    memset(pre_v,0,sizeof(pre_v));
    // 计算前缀和: 前n个矿石的重量和价值
    for(int i=1; i<=n; i++){
        pre_w[i] = pre_w[i-1] + (w[i]>=x ? w[i] : 0);
        pre_v[i] = pre_v[i-1] + (w[i]>=x ? v[i] : 0);
    }

    int res = 0;
    for(int i=1; i<=m; i++){
        res += (pre_w[r[i]] - pre_w[l[i]-1]) * (pre_v[r[i]] - pre_v[l[i]-1]);
    }

    if(res>=s) return 1;
    else       return 0;
}

void run(){
    cin >> n >> m >> s;

    int minn = 0x3f3f3f3f;
    int maxx = 0;
    for(int i=1; i<=n; i++){
        cin >> w[i] >> v[i];
    }

    for(int i=1; i<=m; i++){
        cin >> l[i] >> r[i];
    }

    int left = 0, right = 1e18;

    while(left<right){
        int mid = left + (right-left)/2;
        if(check(mid)){
            left = mid+1;
        }
        else{
            right = mid;
        }
    }

    cout << abs(s-left+1) << "\n";
}

signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
    int T = 1;
    while(T--){
        run();
    }
    return 0;
}

2024/6/24 23:16
加载中...