题目连接: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;
}