poj 2777 Count Color

本文详细介绍了线段树数据结构的实现与应用。通过具体的代码示例,展示了如何构建线段树,进行区间更新和查询操作。适用于需要高效处理区间问题的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一道线段树 简单线段树

只要修改其插入操作即可

#include <iostream>
#include <cstring>
#define maxn 700000
using namespace std;

int n,t,o;
bool vis[32];
struct node
{
	int left,right,mid,cover,f,color;
}seg_tree[3*maxn];
void make(int l,int r,int num)
{
	seg_tree[num].left=l;
	seg_tree[num].right=r;
	seg_tree[num].mid=(l+r)/2;
	seg_tree[num].color=1;
	if(l!=r)
	{
		make(l,seg_tree[num].mid,2*num);
		make(seg_tree[num].mid+1,r,2*num+1);
	}
}
void update(int l,int r,int c,int num)
{
	if(seg_tree[num].left==l && seg_tree[num].right==r)
	{
		seg_tree[num].color=c;
		return ;
	}
	if(seg_tree[num].color==c)
		return ;
	if(seg_tree[num].color!=-1)
	{
		seg_tree[2*num].color=seg_tree[num].color;
		seg_tree[2*num+1].color=seg_tree[num].color;
		seg_tree[num].color=-1;
	}
	if(r<=seg_tree[num].mid)
		update(l,r,c,2*num);
	else if(l>seg_tree[num].mid)
		update(l,r,c,2*num+1);
	else
	{
		update(l,seg_tree[num].mid,c,2*num);
		update(seg_tree[num].mid+1,r,c,2*num+1);
	}
}	
void query(int l,int r,int num)
{
	if(seg_tree[num].color!=-1)
	{
		vis[seg_tree[num].color]=1;
		return ;
	}
	if(r<=seg_tree[num].mid)
		query(l,r,2*num);
	else if(l>seg_tree[num].mid)
		query(l,r,2*num+1);
	else
	{
		query(l,seg_tree[num].mid,2*num);
		query(seg_tree[num].mid+1,r,2*num+1);
	}
}
int main()
{
	int i,j,cnt,a,b,c,tmp;
	char s[3];
	while(scanf("%d%d%d",&n,&t,&o)!=EOF)
	{
		make(1,n,1);
		for(i=1;i<=o;i++)
		{
			scanf("%s%d%d",s,&a,&b);
			if(a>b)
			{
				tmp=a;
				a=b;
				b=tmp;
			}
			if(s[0]=='C')
			{
				scanf("%d",&c);
				update(a,b,c,1);
			}
			else
			{
				memset(vis,0,sizeof(vis));
				query(a,b,1);
				cnt=0;
				for(j=1;j<=30;j++)
					if(vis[j]==1)
						cnt++;
				printf("%d/n",cnt);
			}	
		}
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值