维护和线段树WA很多点?
查看原帖
维护和线段树WA很多点?
22716
神仙酱楼主2024/2/28 21:54

维护sum,如果在修改的时候和小于0就中止.

#include <bits/stdc++.h>
#define LC tr[u << 1]
#define RC tr[u << 1 | 1]
#define PA tr[u]
#define LEN(TR) (TR.r - TR.l + 1)
using namespace std;
using ll = long long;
const int N = 1e6 + 10;
struct node_t {
    int l, r;
    ll sum, tag;
} tr[4 * N];

inline int read() {
    int cur{};
    char ch = getchar();
    for (; !isdigit(ch); ch = getchar())
        ;
    for (; isdigit(ch); ch = getchar())
        cur = (cur << 1) + (cur << 3) + (ch ^ 48);
    return cur;
}

void pushup(int u) {
    PA.sum = LC.sum + RC.sum;
}

void pushdown(int u) {
    if (PA.tag) {
        LC.tag += PA.tag;
        RC.tag += PA.tag;
        LC.sum += PA.tag * LEN(LC);
        RC.sum += PA.tag * LEN(RC);
        PA.tag = 0;
    }
}

void build(int u, int l, int r) {
    PA.l = l, PA.r = r;
    if (PA.l == PA.r) {
        PA.sum = read();
    }
    else {
        int mid = PA.l + PA.r >> 1;
        build(u << 1, l, mid);
        build(u << 1 | 1, mid + 1, r);
        pushup(u);
    }
}

bool modify(int u, int l, int r, int x) {
    if (l <= PA.l && PA.r <= r) {
        PA.sum += (ll)x * LEN(PA);
        PA.tag += x;
        return PA.sum >= 0;
    }
    else {
        pushdown(u);
        int mid = PA.l + PA.r >> 1;
        bool res = true;
        if (l <= mid)
            res &= modify(u << 1, l, r, x);
        if (mid < r)
            res &= modify(u << 1 | 1, l, r, x);
        pushup(u);
        return res;
    }
}

signed main() {
#ifndef ONLINE_JUDGE
    freopen(".in", "r", stdin);
#else
    ios::sync_with_stdio(false);
#endif
    cin.tie(0);
    int n = read(), m = read();
    build(1, 1, n);
    for (int i = 1; i <= m; ++i) {
        int d = read(), s = read(), t = read();
        if (modify(1, s, t, -d) == false) {
            cout << "-1\n" << i;
            return 0;
        }
    }
    cout << 0;
    return 0;
}
2024/2/28 21:54
加载中...