poj 2777Count Color
这道题,做的太悲催了,开始想到每个节点的涂色情况用数组来存,1代表有,0代表没有,提交上去果断RE了好几次,原因是here A, B, C are integers, and A may be larger than B没看到,哎审题不细心呀;
后来改后又tle了,哎这小又没招了,想到是不是没有优化好,然后绞尽脑汁的想优化,结果还是tle,后来无奈的搜了解题报道,才知道用到线段数组的延迟标记,表示压力很大,没办法,稍稍看懂后就表了别人的代码,就A了,哎。。。。。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int n,m,c;
struct e
{
int l,r;
int state;
bool id;
};
e tree[300010];
void build(int s,int t,int p)
{
tree[p].l=s;
tree[p].r=t;
if(s==t) return;
int k=(s+t)>>1;
build(s,k,p<<1);
build(k+1,t,(p<<1)|1);
}
void update(int s,int t,int p,int value)
{
// puts("bug");
int i,j,k;
if(s==tree[p].l&&t==tree[p].r)
{
tree[p].id=1;
tree[p].state = 1<<(value-1);
return;
}
if(tree[p].id)
{
tree[p].id=0;
tree[p<<1].id=1;
tree[(p<<1)|1].id=1;
tree[p<<1].state=tree[p].state;
tree[(p<<1)|1].state=tree[p].state;
}
int mid=(tree[p].l+tree[p].r)>>1;
if(t<=mid)
update(s,t,p<<1,value);
else if(s>mid)
update(s,t,(p<<1)+1,value);
else
{
update(s,mid,p<<1,value);
update(mid+1,t,(p<<1)|1,value);
}
tree[p].state=(tree[p<<1].state)|(tree[(p<<1)|1].state);
if(tree[p<<1].id&&tree[(p<<1)+1].id&&tree[p<<1].state==tree[(p<<1)+1].state)
tree[p].id=1;
}
int find(int s,int t,int p)
{
if(s==tree[p].l&&t==tree[p].r)
{
return tree[p].state;
}
if(tree[p].id) return tree[p].state;
int mid=(tree[p].l+tree[p].r)>>1;
int i=0;
if(t<=mid)
return find(s,t,p<<1);
else if(s>mid)
return find(s,t,(p<<1)+1);
else
{
i=find(s,mid,p*2);
i|=find(mid+1,t,p*2+1);
return i;
}
}
int main()
{
int i,j,k,color;
while(scanf("%d%d%d",&n,&color,&m)!=-1)
{
build(1,n,1);
tree[1].state=1;
tree[1].id=1;
while(m--)
{
getchar();
char c;
scanf("%c",&c);
if(c=='C')
{
scanf("%d%d%d",&i,&j,&k);
if(i<j) swap(i,j);
update(i,j,1,k);
}
else
{
scanf("%d%d",&i,&j);
k=find(i,j,1);
int num=0;
if(i<j) swap(i,j);
// cout<<k<<endl;
for(int s=0;s<color;s++)
if(k&(1<<s)) num++;
printf("%d\n",num);
}
}
}
return 0;
}