您的位置:首页 > 其它

POJ 2777 Count Color

2012-07-15 17:19 281 查看
线段树。各种WA。最后过了,老泪纵横。

View Code

#include <stdio.h>
#define MAXN 100001
int col[MAXN * 4],lazy[MAXN * 4];
void update(int cur)
{
col[cur] = col[cur << 1] | col[cur << 1 | 1];
}

void pushdown(int cur,int x,int y)
{
int mid = (x + y) >> 1,ls = cur << 1,rs = cur << 1 | 1;
if(lazy[cur] != -1)
{
lazy[ls] = lazy[cur];
lazy[rs] = lazy[cur];
col[ls] = lazy[cur];
col[rs] = lazy[cur];
lazy[cur] = -1;
}
}

void build(int cur,int x,int y)
{
int mid = (x + y) >> 1,ls = cur << 1,rs = cur << 1 | 1;
lazy[cur] = -1;
if(x == y)
{
col[cur] = 1;
return;
}
build(ls,x,mid);
build(rs,mid + 1,y);
update(cur);
}

void change(int cur,int x,int y,int s,int t,int c)
{
int mid = (x + y) >> 1,ls = cur << 1,rs = cur << 1 | 1;
if(x >= s && y <= t)
{
col[cur] = c;
lazy[cur] = c;
return;
}
pushdown(cur,x,y);
if(mid >= s)
change(ls,x,mid,s,t,c);
if(mid + 1 <= t)
change(rs,mid + 1,y,s,t,c);
update(cur);
}

void query(int cur,int x,int y,int s,int t,int &ans)
{
int mid = (x + y) >> 1,ls = cur << 1,rs = cur << 1 | 1;

if(x >= s && y <= t)
{
ans |= col[cur];
return;
}
pushdown(cur,x,y);
if(mid >= s)
query(ls,x,mid,s,t,ans);
if(mid + 1 <= t)
query(rs,mid + 1,y,s,t,ans);
//update(cur);
}

int cal(int a)
{
int ans = 0;
while(a)
{
if(a % 2)
ans++;
a >>= 1;
}
return ans;
}

int main()
{
int L,O,T,a,b,c,ans,temp;
char ch;
while(scanf("%d%d%d",&L,&T,&O) == 3)
{
build(1,1,L);
while(O--)
{
/*printf("\n");
for(int i = 0;i <= L * 4;i++)
printf("%d   ",col[i]);
printf("\n");*/
getchar();
scanf("%c",&ch);
if(ch == 'C')
{
scanf("%d%d%d",&a,&b,&c);
if(a > b)
{
temp = a;
a = b;
b = temp;
}
change(1,1,L,a,b,1 << (c - 1));
}
else
{
scanf("%d%d",&a,&b);
if(a > b)
{
temp = a;
a = b;
b = temp;
}
ans = 0;
query(1,1,L,a,b,ans);
printf("%d\n",cal(ans));
}
/*printf("\n");
for(int i = 0;i <= L * 4;i++)
printf("%d   ",col[i]);
printf("\n");
for(int i = 0;i <= L * 4;i++)
printf("%d ",lazy[i]);
printf("\n");*/
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: