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;
}

posted on 2011-09-24 18:05  Goal  阅读(127)  评论(0编辑  收藏  举报

导航