借教室(二分/差分数组)

借教室

#include <bits/stdc++.h>
using namespace std;

const int N = 1e6 + 10;

long long s[N], d[N], t[N], r[N];
long long b[N];
int n, m;

void insert(int l, int r, int c){
    b[l] += c;
    b[r+1] -= c;
}

bool check(int mid){
    memcpy(b, r, sizeof r);
    for(int i = 1; i <= mid; ++i){
        b[s[i]] -= d[i];
        b[t[i]+1] += d[i];
    }
    long long ans = 0;
    for(int i = 1; i <= n; ++i){
        ans += b[i];
        if(ans < 0) return false;
    }
    return true;
}
signed main(){
    cin >> n >> m;
    for(int i = 1; i <= n; ++i) cin >> r[i];
    
    //计算差分数组
    for(int i = n; i >= 1; --i) r[i] = r[i] -= r[i-1];
    for(int i = 1; i <= m; ++i) cin >> d[i] >> s[i] >> t[i];
    
    if(check(m)){
        cout << 0 << endl;
        return 0;
    }
    int l = 1, r = m;
    while(l < r){
        int mid = l + r >> 1;
        if(check(mid)) l = mid + 1;
        else r = mid;
    }
    cout << l << endl;
    
    return 0;
}
posted @ 2025-03-28 14:52  awei040519  阅读(23)  评论(0)    收藏  举报