线段树的题目
#include <cstdio> #define LL(x) x << 1 #define RR(x) x << 1 | 1 const int MAXN = 200000 + 123; struct NODE { int l, r, rmax, rmin; int lazy; int mid() { return (l + r) >> 1; } }tree[MAXN * 3]; int p; int c, C; int max(int a, int b) { return a > b ? a : b; } int min(int a, int b) { return a > b ? b : a; } void build(int l, int r, int idx) { tree[idx].l = l; tree[idx].r = r; tree[idx].rmax = tree[idx].rmin = 0; tree[idx].lazy = 0; if(l == r) return; int mid = tree[idx].mid(); build(l, mid, LL(idx)); build(mid + 1, r, RR(idx)); } void push_down(int idx) { int l = LL(idx); int r = RR(idx); tree[l].lazy += tree[idx].lazy; tree[l].rmax += tree[idx].lazy; tree[l].rmin += tree[idx].lazy; tree[r].lazy += tree[idx].lazy; tree[r].rmax += tree[idx].lazy; tree[r].rmin += tree[idx].lazy; tree[idx].lazy = 0; } void push_up(int idx) { int l = LL(idx); int r = RR(idx); tree[idx].rmax = max(tree[l].rmax, tree[r].rmax); tree[idx].rmin = min(tree[l].rmin, tree[r].rmin); } void update(int l, int r, int idx) { if(l <= tree[idx].l && tree[idx].r <= r) { if(tree[idx].rmax < p) { tree[idx].lazy += c; tree[idx].rmax += c; tree[idx].rmin += c; return ; } if(tree[idx].rmin >= p) { tree[idx].lazy += C; tree[idx].rmax += C; tree[idx].rmin += C; return ; } } push_down(idx); int mid = tree[idx].mid(); if(r <= mid) update(l, r, LL(idx)); else if(l > mid) update(l, r, RR(idx)); else { update(l, mid, LL(idx)); update(mid + 1, r, RR(idx)); } push_up(idx); } bool flag; void query(int idx) { if(tree[idx].l == tree[idx].r) { if(flag) printf(" "); else flag = true; printf("%d", tree[idx].lazy); return; } int l = LL(idx); int r = RR(idx); tree[l].lazy += tree[idx].lazy; tree[r].lazy += tree[idx].lazy; query(l); query(r); } inline void scan(int &u, int &v, int &w) { char c; while(c = getchar(), c < '0' || c > '9'); u = c - '0'; while(c = getchar(), c <= '9' && c >= '0') u = u * 10 + c - '0'; while(c = getchar(), c < '0' || c > '9'); v = c - '0'; while(c = getchar(), c <= '9' && c >= '0') v = v * 10 + c - '0'; while(c = getchar(), c < '0' || c > '9'); w = c - '0'; while(c = getchar(), c <= '9' && c >= '0') w = w * 10 + c - '0'; } int main() { int n, m; while(scanf("%d%d%d", &n, &m, &p) != EOF) { build(1, n, 1); while(m--) { int a, b; scan(a, b, c); C = c * 2; update(a, b, 1); } flag = false; query(1); puts(""); } return 0; }