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:RE了很多次 不知道是什么原因 大牛们帮我找一下吧 谢谢谢In Reply To:RE了很多次 不知道是什么原因 大牛们帮我找一下吧 谢谢谢 Posted by:Binbin1212 at 2011-08-06 10:53:45 > #pragma warning (disable:4786) > #include <iostream> > #include <stdio.h> > #include <string> > #include <string.h> > #include <stdlib.h> > #include <algorithm> > #include <vector> > #include <map> > #include <math.h> > #include <queue> > #include <stack> > #include <list> > #include <deque> > #include <set> > #include <numeric> > #include <functional> > #include <ctype.h> > #include <utility> > #include <cassert> > #include <time.h> > using namespace std; > > #define Maxn 1000001 > > map<int,int>c; > > int ans; > > struct node > { > int l,r; > int color[32]; > int sum; > int cover; > node() > { > memset(color,0,sizeof(color)); > } > }T[Maxn*4]; > > void Build(int l,int r,int root) > { > T[root].l=l; > T[root].r=r; > T[root].cover=1; > T[root].color[1]=1; > if(l==r) > { > > return; > } > if(l<r) > {int Mid=(l+r)/2; > Build(l,Mid,root*2); > Build(Mid+1,r,root*2+1); > } > } > > > > void add(int l,int r,int w,int root) > { > int i; > if(T[root].cover) > { > > int ww; > for(i=1;i<32;i++) > if(T[root].color[i]) > { > ww=i; > break; > } > for(i=1;i<32;i++) > { > T[root*2].color[i]=0; > T[root*2+1].color[i]=0; > } > T[root*2].color[ww]=1; > T[root*2+1].color[ww]=1; > T[root*2].cover=1; > T[root*2+1].cover=1; > } > if(T[root].l==l&&T[root].r==r) > { > for(i=1;i<32;i++) > if(T[root].color[i]) > T[root].color[i]=0; > T[root].color[w]=1; > T[root].cover=1; > return; > } > > if(T[root].l<T[root].r) > {int Mid=(T[root].l+T[root].r)/2; > if(r<=Mid) > add(l,r,w,root*2); > else if(l>Mid) > add(l,r,w,root*2+1); > else > { > add(l,Mid,w,root*2); > add(Mid+1,r,w,root*2+1); > }} > int t=0; > for(i=1;i<32;i++) > { > T[root].color[i]=0; > if(T[root*2].color[i]||T[root*2+1].color[i]) > { > T[root].color[i]=1; > t++; > } > } > if(t==1&&T[root*2].cover&&T[root*2+1].cover) > T[root].cover=1; > else > T[root].cover=0; > } > > void querysum(int l,int r,int root) > { > int i; > if(T[root].cover) > { > for(i=1;i<32;i++) > if(T[root].color[i]&&!c[i]) > { > ans++; > c[i]=1; > } > return; > } > if(T[root].l==l&&T[root].r==r) > { > for(i=1;i<32;i++) > { > // printf("clolor=%d,c[i]=%d\n",T[root].color[i],c[i]); > if(T[root].color[i]&&!c[i]) > { > c[i]=1; > ans++; > }} > return; > } > if(T[root].l<T[root].r) > {int Mid=(T[root].l+T[root].r)/2; > if(r<=Mid) > querysum(l,r,root*2); > else if(l>Mid) > querysum(l,r,root*2+1); > else > { > querysum(l,Mid,root*2); > querysum(Mid+1,r,root*2+1); > }} > } > > int main() > { > int n,m,o,i,x,y,z; > char s[2]; > scanf("%d%d%d",&n,&m,&o); > Build(1,n,1); > while(o--) > { > scanf("%s",s); > if(s[0]=='P') > { > scanf("%d%d",&x,&y); > if(x>y) > { > i=x; > x=y; > y=i; > } > ans=0; > c.clear(); > querysum(x,y,1); > //printf("%d %d %d %d\n",T[1].color[9],T[1].color[10],T[1].color[9],T[1].color[10]); > //printf("%d\n",T[7].cover); > printf("%d\n",ans); > } > else if(s[0]=='C') > { > scanf("%d%d%d",&x,&y,&z); > if(x>y) > { > i=x; > x=y; > y=i; > } > add(x,y,z,1); > // printf("%d\n",T[1].color[2]); > } > } > return 0; > } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator