求助 WA on #5
查看原帖
求助 WA on #5
637788
kimi0705楼主2024/7/5 16:37
#include <bits/stdc++.h>
#define fi first
#define se second
#define multi false
#define gc getchar
#define pc putchar
#define pb push_back
#define ls (o * 2)
#define rs (o * 2 + 1)
#define int long long
#define pii pair<int, int>
#define debug(x) cout << #x << " " << x << '\n'
#define For(i, x, y) for (int i = (x); i <= (y); i++)
#define Rof(i, x, y) for (int i = (x); i >= (y); i--)
using namespace std;
inline int gcd(int a, int b) {
    return b == 0 ? a : gcd(b, a % b);
}
inline int lcm(int a, int b) {
    return a * b / gcd(a, b);
}
int read(char ch = ' ', int x = 0, int w = 1) {
    while (!isdigit(ch)) {
        if (ch == '-') w = -1;
        ch = gc();
    }
    while (isdigit(ch)) { x = x * 10 + (ch - '0'), ch = gc(); }
    return x * w;
}
void read(int& x) {
    x = read();
}
void read(int n, int a[]) {
    For(i, 1, n) a[i] = read();
}
void read(int n, int a[], int b[]) {
    For(i, 1, n)
        a[i]
        = read(),
        b[i] = read();
}
void write(int x) {
    if (x < 0) x = -x, pc('-');
    if (x > 9) write(x / 10);
    pc(x % 10 + '0');
}
void write(int n, int a[]) { For(i, 1, n) write(a[i]), pc(' '); }
/*=============================================================================================================================================================================================*/
const int N = 1e5 + 10;
const int M = N << 2;
const int MIN = -1e15;
int t = 1, n, m, q, l, r, deta;
int ans[N];
bool debuG = false;
vector<pii> vec[N]; // first -> id; second -> deta
struct que {
    int l, r, id;
};
vector<que> Q[N];
struct seg {
    struct node {
        int Left = 0, Right = 0, Max = 0, Sum = 0;
    } Tree[M];
    node Add(node x, node y) {
        if (x.Left == MIN && x.Max == MIN && x.Right == MIN && x.Sum == MIN) return y;
        if (y.Left == MIN && y.Max == MIN && y.Right == MIN && y.Sum == MIN) return x;
        node ans;
        ans.Left = max(x.Left, x.Sum + y.Left);
        ans.Right = max(x.Right + y.Sum, y.Right);
        ans.Sum = x.Sum + y.Sum;
        ans.Max = max(max(ans.Left, ans.Right), max(max(x.Right, y.Left), x.Right + y.Left));
        return ans;
    }
    void pushup(int o) {
        Tree[o] = Add(Tree[ls], Tree[rs]);
        return;
    }
    void add(int o, int l, int r, int x, int deta) {
        if (l <= x && x <= r)
            ;
        else
            return;
        if (l == r) {
            Tree[o].Left = Tree[o].Right = Tree[o].Max = Tree[o].Sum = Tree[o].Sum + deta;
            return;
        }
        int mid = (l + r) >> 1;
        add(ls, l, mid, x, deta);
        add(rs, mid + 1, r, x, deta);
        pushup(o);
    }
    node query(int o, int l, int r, int L, int R) { // [L, R] query
        if ((L <= l && l <= R) || (L <= r && r <= R) || l <= L && L <= R && R <= r)
            ;
        else
            return { MIN, MIN, MIN, MIN };
        if (L <= l && l <= r && r <= R) return Tree[o];
        if (l == r) return { Tree[o].Left, Tree[o].Left, Tree[o].Left, Tree[o].Left };
        int mid = (l + r) >> 1;
        node LE = query(ls, l, mid, L, R);
        node RI = query(rs, mid + 1, r, L, R);
        // printf("query(%lld, %lld, %lld, %lld, %lld) = {%lld, %lld, %lld, %lld}\n", ls, l, mid, L, R, LE.Max, LE.Left, LE.Right, LE.Sum);
        // printf("query(%lld, %lld, %lld, %lld, %lld) = {%lld, %lld, %lld, %lld}\n", ls, mid + 1, r, L, R, RI.Max, RI.Left, RI.Right, RI.Sum);
        return Add(LE, RI);
    }
} Tree;
void solve() {
    read(n), read(m);
    For(i, 1, m) {
        read(l), read(r), read(deta);
        vec[l].push_back({ i, deta });
        vec[r + 1].push_back({ i, -deta });
    }
    read(q);
    For(i, 1, q) Q[read()].pb({ read(), read(), i });
    For(i, 1, n) {
        for (auto [id, val] : vec[i])
            Tree.add(1, 1, m, id, val);
        for (auto [l, r, id] : Q[i])
            ans[id] = Tree.query(1, 1, m, l, r).Max;
    }
    // debug(Tree.query(1, 1, m, 2, 9).Max); pc(10);
    // debug(Tree.query(1, 1, m, 2, 5).Left); pc(10);
    // debug(Tree.query(1, 1, m, 6, 9).Right); pc(10);
    For(i, 1, q)
        write(ans[i]),
        pc(10);
    return;
}
signed main() {
    if (multi) read(t);
    while (t--)
        solve();
    return 0;
}
8 36
1 1 -3
1 2 -2
1 3 2
1 4 6
1 5 -2
1 6 6
1 7 -4
1 8 6
2 2 -7
2 3 -1
2 4 0
2 5 -9
2 6 -7
2 7 -11
2 8 7
3 3 -19
3 4 9
3 5 -12
3 6 -9
3 7 -6
3 8 4
4 4 5
4 5 -4
4 6 -6
4 7 -3
4 8 -8
5 5 8
5 6 5
5 7 -18
5 8 -10
6 6 -18
6 7 0
6 8 -20
7 7 -9
7 8 5
8 8 9

1 

2 2 27

ans: 14 output: 12

2024/7/5 16:37
加载中...