您的位置:首页 > 其它

poj 2777 Count Color(线段树)

2017-05-03 17:09 477 查看
和poj 2528差不多

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1

const int MAXN = 100010;
//col[rt]=-1 表示rt节点管理的区间内的颜色是不同的颜色
//col[rt] != -1 表示当前区间都是同一种颜色
int col[MAXN<<2];
//查询的时候用于标记颜色
int mark[33];
int res;

void build(int l, int r, int rt)
{
col[rt] = 1;
if(l == r) return;
int m = (l+r) >> 1;
build(lson);
build(rson);
}

void pushDown(int l, int r, int rt)
{
if(col[rt] != -1)
{
col[rt<<1] = col[rt<<1|1] = col[rt];
col[rt] = -1;
}
}

void update(int L, int R, int c, int l, int r, int rt)
{
if(l >= L && r <= R)
{
col[rt] = c;
return ;
}
//假设当前区间都是同一种颜色,(L,R)和当前区间有交集,则要把当前区间
//之前标记的颜色都推到子节点,然后再递归去更新需要更新的区间
pushDown(l,r,rt);
int m = (l+r) >> 1;
if(L <= m)
update(L,R,c,lson);
if(R > m)
update(L,R,c,rson);
}

void query(int L, int R, int l, int r ,int rt)
{
if(col[rt] != -1)
{
if(mark[col[rt]] == 0)
{
mark[col[rt]] = 1;
res++;
}
return;
}
if(l == r) return;
int m = (l+r) >> 1;
if(L <= m) query(L,R,lson);
if(R > m) query(L,R,rson);
}

int main()
{
int L,T,O;
char ch;
int a,b,c;
while(scanf("%d %d %d",&L,&T,&O) != EOF)
{
build(1,L,1);
while(O--)
{
scanf(" %c",&ch);
if(ch == 'C')
{
scanf("%d %d %d",&a,&b,&c);
update(a,b,c,1,L,1);
}
else
{
scanf("%d %d",&a,&b);
res = 0;
memset(mark,0,sizeof(mark));
query(a,b,1,L,1);
printf("%d\n",res);
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: