您的位置:首页 > 其它

POJ 2777 线段树 线段染色 基础题

2013-10-01 14:22 344 查看
#include "stdio.h"
#include "string.h"
#include "math.h"
#include "stdlib.h"
#include "algorithm"
using namespace std;

struct comp
{
int l,r,mid;
int lazy,color;
} data[300001];

int hash[50];
int ans;

void build(int l,int r,int k)
{
data[k].l=l;
data[k].r=r;
data[k].mid=(l+r)/2;
data[k].color=1;
data[k].lazy=-1;

if (l==r) return ;

build(l,data[k].mid,k*2);
build(data[k].mid+1,r,k*2+1);
}

void Pushdown(int k)
{
if (data[k].l==data[k].r) return ;

if (data[k].lazy!=-1)
{
data[k*2].lazy=data[k*2+1].lazy=data[k].lazy;
data[k].lazy=-1;

data[k*2].color=data[k*2+1].color=data[k*2].lazy;
}
}

void update(int l,int r,int k,int op)
{
Pushdown(k);

if (data[k].l==l && data[k].r==r)
{
data[k].color=op;
data[k].lazy=op;
return ;
}

if (r<=data[k].mid) update(l,r,k*2,op);
else
if (l>data[k].mid) update(l,r,k*2+1,op);
else
{
update(l,data[k].mid,k*2,op);
update(data[k].mid+1,r,k*2+1,op);
}

if (data[k*2].color==data[k*2+1].color ) data[k].color=data[k*2].color; else data[k].color=-1;

}

void query(int l,int r,int k)
{
if (data[k].color!=-1 || data[k].l==data[k].r)
{
if (hash[data[k].color]==0) ans++;
hash[data[k].color]=1;
return ;
}

if (r<=data[k].mid) query(l,r,k*2);
else
if (l>data[k].mid) query(l,r,k*2+1);
else
{
query(l,data[k].mid,k*2);
query(data[k].mid+1,r,k*2+1);
}
}

int main()
{
int n,t,m,x,y,z;
char ch[10];

while (scanf("%d%d%d",&n,&t,&m)!=EOF)
{
build(1,n,1);

while (m--)
{
scanf("%s",ch);
if (ch[0]=='C')
{
scanf("%d%d%d",&x,&y,&z);
if (x>y) swap(x,y);
update(x,y,1,z);
}
else
{
scanf("%d%d",&x,&y);
if (x>y) swap(x,y);
memset(hash,0,sizeof(hash));
ans=0;
query(x,y,1);
printf("%d\n",ans);
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: