洛谷P1083

P1083 [NOIP 2012 提高组] 借教室

这也太多二分题了

点击查看代码
#include<bits/stdc++.h>
using namespace std;
using ll = long long;

const int N = 1e6+10;
ll r[N];
ll d[N], s[N], t[N];
ll diff[N];
int n, m;

bool check(int x) {
    memset(diff, 0, sizeof(diff));
    for(int i = 1; i <= x; i++) {
        diff[s[i]] += d[i];
        diff[t[i] + 1] -= d[i];
    }
    ll sum = 0;
    for(int i = 1; i <= n; i++) {
        sum += diff[i];
        if(sum > r[i]) return 0;
    }
    return 1;
}

int main() {
    cin >> n >> m;
    for(int i = 1; i <= n; i++) {
        cin >> r[i];
    }
    for(int i = 1; i <= m; i++) {
        cin >> d[i] >> s[i] >> t[i];
        // diff[s[i]]++;
        // diff[t[i] + 1]--;
    }

    if(check(m)) {
        cout << "0\n";
    } else {
        int l = 1, r = m, ans = 0;
        while(l <= r) {
            int mid = (l + r) / 2;
            if(check(mid)) {
                l = mid + 1;
            } else {
                ans = mid;
                r = mid - 1;
            }
        }
    cout << "-1\n" << ans << '\n';
    }
    return 0;
}
posted @ 2025-05-18 20:22  Chuan81  阅读(12)  评论(0)    收藏  举报