| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
Re:能帮我看看吗? 你们的数据我都过了,不过还是Wa!In Reply To:Re:能帮我看看吗? 你们的数据我都过了,不过还是Wa! Posted by:liulingling at 2009-08-10 15:04:20 +++++++++++++++++++++++++++++
> #include <stdio.h>
> int L,T,Q;
> struct Tree
> {
> int left;
> int right;
> int color;
> }t[500000];
> int lone(int i)
> {
> return i&(i-1);
> }
> void f(int pos)
> {
> while(pos!=1)
> {
> int temp=pos;
> if(pos%2==1)pos=(pos-1)/2;
> else pos=pos/2;
> t[pos].color=(t[pos*2+1].color)|(t[pos*2].color);
> }
> }
> void build(int left,int right,int step)
> {
> t[step].left=left;
> t[step].right=right;
> t[step].color=1;
> if(left==right)return ;
> int mid=(left+right)/2;
> build(left,mid,step*2);
> build(mid+1,right,step*2+1);
> }
> void color(int left,int right,int step,int c)
> {
> int mid=(t[step].left+t[step].right)/2;
> if(left<=t[step].left&&right>=t[step].right)
> {
> t[step].color=c;
> f(step);
> return ;
> }
> if(t[step].color==c)return ;
> if(lone(t[step].color)==0)
> {
> t[step*2].color=t[step].color;
> t[step*2+1].color=t[step].color;
> }
> if(mid>=right)
> {
> color(left,right,2*step,c);
> }
> else if(mid<left)
> {
> color(left,right,2*step+1,c);
> }
> else
> {
> color(left,mid,2*step,c);
> color(mid+1,right,2*step+1,c);
> }
> t[step].color=t[step*2].color | t[step*2+1].color;
> }
> void search(int left,int right,int step,int &cnt)
> {
> int mid;
> if(left<=t[step].left&&right>=t[step].right)
> {
> cnt|=t[step].color;
> return;
> }
> mid=(t[step].left+t[step].right)/2;
> if(mid>=right)
> {search(left,right,step*2,cnt);}
> else if(mid<left)search(left,right,step*2+1,cnt);
> else
> {
> search(left,mid,2*step,cnt);
> search(mid+1,right,2*step+1,cnt);
> }
> }
> int count(int c)// 统计
> {
> int i,cnt=0;
> for(i=1;i<=30;i++)
> {
> int temp=c%2;
> c/=2;
> if(temp)
> cnt++;
> }
> return cnt;
> }
> int main()
> {
> int a,b,c;
> char ch;
> scanf("%d %d %d",&L,&T,&Q);
> build(1,L,1);//建树
> while(Q--)
> {
> getchar();
> scanf("%c",&ch);
> if(ch=='C')
> {
> int p=1;
> scanf("%d %d %d",&a,&b,&c);
> if(a>b)
> a^=b^=a^=b;
> while(--c)
> p*=2;
> color(a,b,1,p);// 染色
> }
> else
> {
> scanf("%d %d",&a,&b);
> if(a>b)
> a^=b^=a^=b;
> int cnt=0;
> search(a,b,1,cnt);
> // printf("cnt : %d\n",cnt);
> printf("%d\n",count(cnt));
> }
> }
> return 0;
> }
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator