hdu 1698 线段树 一段更新染色

其中的标志s用的很妙,非常精髓,标记是否是纯色,单色,是否往下递归,计算单色数据

#include <iostream>
#include <cstdio>
using namespace std;

const int MAXN=2000000;

int n,m,a[MAXN+5],ans;

struct tree
{
	int l,r;

	int s;

}trees[MAXN*2];

int max(int k,int l)
{
	return k>l?k:l;
}

void buildtree(int rs,int l,int r)
{
	//printf("%d %d %d\n",rs,l,r);
	trees[rs].l=l;
	trees[rs].r=r;
	trees[rs].s=1;

	if(r==l)
		return;

	int mid=(l+r)/2;

	buildtree(rs*2,l,mid);
	buildtree(rs*2+1,mid+1,r);
}

void update(int rs,int l,int r,int u)
{
	if(trees[rs].l>r||trees[rs].r<l)
		return ;

	//printf("%d %d %d %d %d\n",rs,k,l,trees[rs].l,trees[rs].r);
	if(trees[rs].l>=l&&trees[rs].r<=r)
	{
		trees[rs].s=u;
		return ;
	}

	if(trees[rs].s!=-1)
	{
		trees[2*rs].s=trees[rs].s;
		trees[2*rs+1].s=trees[rs].s;
		trees[rs].s=-1;
	}

	update(rs*2,l,r,u);
	update(rs*2+1,l,r,u);
}

void querry(int rs)
{
	if(trees[rs].s!=-1)
	{
		ans+=(trees[rs].r-trees[rs].l+1)*trees[rs].s;
		return ;
	}

	if(trees[rs].l==trees[rs].r)
		return ;
	querry(2*rs);
	querry(2*rs+1);
}

int main()
{
	int i,ac,bc,t,p;

	int c;

	scanf("%d",&t);

	p=1;

	while(t--)
	{
		scanf("%d%d",&n,&m);

		buildtree(1,1,n);

		for(i=1;i<=m;i++)
		{
			scanf("%d%d%d",&c,&ac,&bc);

			update(1,c,ac,bc);
		}
		ans=0;

		querry(1);

		printf("Case %d: The total value of the hook is %d.\n",p++,ans);
	}

	return 0;
}

  

原文地址:https://www.cnblogs.com/jackes/p/2453758.html