HDU 1698 线段树区间维护
#include<bits/stdc++.h> using namespace std; const int N = 1e5 + 20; struct edge { int sum, tag; }seg[N << 2]; int T, n, m; void update(int id) { seg[id].sum = seg[id << 1].sum + seg[id << 1 | 1].sum; } void build(int id, int l, int r) { if (l == r) { seg[id].sum = 1; seg[id].tag = 0; return; } int mid = (l + r) >> 1; build(id << 1, l, mid); build(id << 1 | 1, mid + 1, r); update(id); } void push_down(int id, int l, int r) { int mid = (l + r) >> 1; seg[id << 1].sum = (mid - l + 1) * seg[id].tag; seg[id << 1 | 1].sum = (r - mid) * seg[id].tag; seg[id << 1].tag = seg[id].tag; seg[id << 1 | 1].tag = seg[id].tag; seg[id].tag = 0; } void modify(int id, int l, int r, int ql, int qr, int v) { if (l == ql && r == qr) { seg[id].tag = v; seg[id].sum = (r - l + 1) * v; return; } if(seg[id].tag) push_down(id, l, r); int mid = (l + r) >> 1; if (qr <= mid) modify(id << 1, l, mid, ql, qr, v); else if (ql > mid) modify(id << 1 | 1, mid + 1, r, ql, qr, v); else { modify(id << 1, l, mid, ql, mid, v); modify(id << 1 | 1, mid + 1, r, mid + 1, qr, v); } update(id); } int main() { scanf("%d", &T); int cnt = 0; while (T--) { scanf("%d%d", &n, &m); build(1, 1, n); int a, b, c; for (int i = 1; i <= m; i++) { scanf("%d%d%d", &a, &b, &c); modify(1, 1, n, a, b, c); } printf("Case %d: The total value of the hook is %d.\n", ++cnt, seg[1].sum); } return 0; }