题目连接:hdu 1698
区间更新, 线段树维护两个关键值, 一个是col表示颜色,即题目那三种,另一个关键是保存区间和sum,col用延迟标记,即当需要访问到儿子结点的时候才把col传递下去,并且更新儿子结点的sum值
代码:
#include<cstdio> #define MAXN 100010 struct node{ int left, right, sum, col; }tree[MAXN<<2]; int ans; void build(int left, int right, int root) { tree[root].left = left; tree[root].right = right; if(left == right) { return ; } int mid = (tree[root].left + tree[root].right) >> 1; build(left, mid, root<<1); build(mid + 1, right, root<<1|1); } void pushDown(int root) { if(tree[root].col != -1){ tree[root<<1].col = tree[root].col; tree[root<<1|1].col = tree[root].col; tree[root].col = -1; } } void upDate(int left, int right, int c, int root) { if(tree[root].left == left && tree[root].right == right){ tree[root].col = c; return ; } pushDown(root); int mid = (tree[root].left + tree[root].right) >> 1; if(mid >= right) upDate(left, right, c, root<<1); else if(mid < left) upDate(left, right, c, root<<1|1); else{ upDate(left, mid, c, root<<1); upDate(mid + 1, right, c, root<<1|1); } } void query(int left, int right, int root) { if(tree[root].col != -1){ ans += tree[root].col * (right - left + 1); return ; } if(left == right) return; int mid = (tree[root].left + tree[root].right) >> 1; query(left, mid, root<<1); query(mid + 1, right, root<<1|1); } int main() { int t, n, q; scanf("%d", &t); for(int k = 1; k <= t; k++){ int a, b, c; ans = 0; scanf("%d%d", &n, &q); build(1, n, 1); upDate(1, n, 1, 1); for(int i = 1; i <= q; i++){ scanf("%d%d%d", &a, &b, &c); upDate(a, b, c, 1); } query(1, n, 1); printf("Case %d: The total value of the hook is %d.\n", k, ans); } return 0; }