← 返回题目页

P1083 [NOIP 2012 提高组] 借教室

标程

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

// 快读:n、m 都到 1e6 时,光是解析输入就占掉大半时间,cin 顶不住时限
class FastInput {
    static const int SIZE = 1 << 16;
    char buf[SIZE];
    int pos = 0, len = 0;

    char getChar() {
        if (pos == len) {
            len = (int)fread(buf, 1, SIZE, stdin);
            pos = 0;
            if (len == 0) return 0;
        }
        return buf[pos++];
    }

public:
    template <class T>
    bool read(T &x) {
        char c = getChar();
        while (c && c != '-' && (c < '0' || c > '9')) c = getChar();
        if (!c) return false;
        bool neg = false;
        if (c == '-') { neg = true; c = getChar(); }
        x = 0;
        while (c >= '0' && c <= '9') { x = x * 10 + (c - '0'); c = getChar(); }
        if (neg) x = -x;
        return true;
    }
};

struct Order {
    long long d;
    int s, t;
};

int main() {
    FastInput in;

    int n, m;
    in.read(n);
    in.read(m);

    vector<long long> r(n + 2, 0);
    for (int i = 1; i <= n; i++) in.read(r[i]);

    vector<Order> orders(m + 1);
    for (int j = 1; j <= m; j++) {
        in.read(orders[j].d);
        in.read(orders[j].s);
        in.read(orders[j].t);
    }

    vector<long long> diff(n + 3, 0);

    // 前 k 份订单能否全部满足
    auto check = [&](int k) -> bool {
        fill(diff.begin(), diff.end(), 0LL);
        for (int j = 1; j <= k; j++) {
            diff[orders[j].s] += orders[j].d;
            diff[orders[j].t + 1] -= orders[j].d;
        }
        long long used = 0;
        for (int i = 1; i <= n; i++) {
            used += diff[i];
            if (used > r[i]) return false;
        }
        return true;
    };

    int lo = 0, hi = m;
    while (lo < hi) {
        int mid = lo + (hi - lo + 1) / 2;
        if (check(mid)) lo = mid;
        else hi = mid - 1;
    }

    if (lo == m) {
        printf("0\n");
    } else {
        printf("-1\n%d\n", lo + 1);
    }
    return 0;
}

动画演示