hdu 1698 just a hook(线段树区间更新)

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

猜你喜欢

转载自blog.csdn.net/qq_35930475/article/details/80108159