http://acm.hdu.edu.cn/showproblem.php?pid=1698
/*843ms,2288KB*/ #include <cstdio> #include <algorithm> using namespace std; #define lson l , m , rt << 1 #define rson m + 1 , r , rt << 1 | 1 #define root 1, n, 1 const int maxn = 100000; int sum[maxn << 2], cache[maxn << 2]; inline void pushup(int rt) { sum[rt] = sum[rt << 1] + sum[rt << 1 | 1]; } inline void pushdown(int rt, int m) { if (cache[rt]) { cache[rt << 1] = cache[rt << 1 | 1] = cache[rt];///更新左右子区间cache sum[rt << 1] = (m - (m >> 1)) * cache[rt]; sum[rt << 1 | 1] = (m >> 1) * cache[rt];///平分cache,更新左右子区间和 cache[rt] = 0; } } void build(int l, int r, int rt) { cache[rt] = 0; sum[rt] = 1; if (l == r) return; int m = (l + r) >> 1; build(lson); build(rson); pushup(rt); } void update(int ql, int qr, int c, int l, int r, int rt) { if (ql <= l && r <= qr) { cache[rt] = c; sum[rt] = c * (r - l + 1); return; } ///打开上层acahe,往下细分计算 pushdown(rt , r - l + 1); int m = (l + r) >> 1; if (ql <= m) update(ql , qr , c , lson); if (qr > m) update(ql , qr , c , rson); pushup(rt); } int main() { int T, n, m, a, b, c; scanf("%d", &T); for (int cas = 1 ; cas <= T ; cas ++) { scanf("%d%d", &n, &m); build(root); while (m--) { scanf("%d%d%d", &a, &b, &c); update(a, b, c, root); } printf("Case %d: The total value of the hook is %d.\n", cas, sum[1]); } return 0; }