现在的位置: 首页 > 综合 > 正文

poj 2777 Count Color

2018年04月26日 ⁄ 综合 ⁄ 共 1383字 ⁄ 字号 评论关闭
//更新区间,求区间数的种类
#include<stdio.h>
#include<string.h>
const int max=100000;
int flag[31];
struct node
{
	int left,right,color;
}nodes[3*max];
void build(int l,int r,int id)
{
	nodes[id].left=l;//这里是参数l,大写是L,而不是1,错了几次
	nodes[id].right=r;
	nodes[id].color=1;//这里是数字1
	if(l==r) return ;
	int mid=(l+r)>>1;
	build(l,mid,id<<1);//id*2
	build(mid+1,r,id<<1|1);//id*2+1
}
void insert(int id,int l,int r,int cc)
{
	if(nodes[id].left>=l&&nodes[id].right<=r)
	{
		nodes[id].color=cc;
		return ;
	}
	if(nodes[id].left==nodes[id].right)return ;
	if(nodes[id].color>0)//懒惰标记,标记父节点,而暂时不更新子节点,当要询问时再来更新
        {
		nodes[id*2].color=nodes[id].color;
		nodes[id*2+1].color=nodes[id].color;
		nodes[id].color=-1;
	}
	
	int mid=(nodes[id].left+nodes[id].right)>>1;
	if(mid>=r) insert(id*2,l,r,cc);
	else if(mid<l) insert(id*2+1,l,r,cc);
	else
	{
		insert(id*2,l,mid,cc);
		insert(id*2+1,mid+1,r,cc);
	}
}
void count(int l,int r,int id)
{
	if(nodes[id].color>0)
	{
		flag[nodes[id].color]=1;
		return ;
	}
	int mid=(nodes[id].left+nodes[id].right)>>1;
	if(mid>=r) count(l,r,id*2);
	else if(mid<l) count(l,r,id*2+1);
	else 
	{
		count(l,mid,id*2);
		count(mid+1,r,id*2+1);
	}
}
int main()
{
	int n,m,k,a,b,c,ee,ff;
	char char1;
	scanf("%d%d%d",&n,&m,&k);
	build(1,n,1);
	while(k--)
	{
		getchar();
		scanf("%c",&char1);
		if(char1=='C')
		{
			scanf("%d%d%d",&a,&b,&c);
			if(a>b)
				insert(1,b,a,c);
			else 
				insert(1,a,b,c);
		}
		else
		{ 
		     scanf("%d%d",&ee,&ff);
			 memset(flag,0,sizeof(flag));

			 if(ee>ff) 
				 count(ff,ee,1);
			 else 
				 count(ee,ff,1);

			 int sum=0;
	         for(int j=1;j<=m;j++)
	         {
                if(flag[j])sum++;
	         }
	         printf("%d\n",sum);
		}
		
	}
	return 0;
}










【上篇】
【下篇】

抱歉!评论已关闭.