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 |
help,那位大牛帮忙看一下错在哪里了,编了很多测试数据都没问题/******************************************************************** created: 2006/03/29 created: 29:3:2006 21:22 author: Decster purpose: Pku 2777 Count Color *********************************************************************/ #include <stdio.h> #define MAXN 100020 #define COVER 1 #define ISCOVER(x) ( x & COVER ) #define COLOR(x) (1<<x) #define INITCOLOR 3 int l,t,o; int odder; int a,b,c,temp; unsigned color; struct TreeNode { unsigned color; int left; int right; }; TreeNode segtree[MAXN*4]; void initfill(int index,int a,int b) { segtree[index].color = INITCOLOR; if(a==b) { segtree[index].left=segtree[index].right=a; return; } int mid = (a+b)/2; segtree[index].left = a; segtree[index].right = b; initfill(index*2,a,mid); initfill(index*2+1,mid+1,b); } void update(int index,int a,int b) { if( ISCOVER(segtree[index].color) && (color == (segtree[index].color^COVER) ) ) return; if(a==segtree[index].left && b==segtree[index].right) { segtree[index].color=color; segtree[index].color|=COVER; }else { segtree[index].color = 0; int mid = (segtree[index].left+segtree[index].right)/2; if(a<=mid) { if(b<mid) update(index*2,a,b); else update(index*2,a,mid); } if(b>mid){ if(a>mid) update(index*2+1,a,b); else update(index*2+1,mid+1,b); } } } unsigned getcolor(int index,int a,int b) { if(ISCOVER(segtree[index].color) ) { return segtree[index].color; } unsigned result=0; int mid = (segtree[index].left+segtree[index].right)/2; if(a<=mid) result |= getcolor(index*2,a,mid); if(b>mid) result |= getcolor(index*2+1,mid+1,b); return result; } int getColorKindNum(unsigned color) { int i; int result=0; for(i=1;i<=o;i++) { if( color & COLOR(i) ) result++; } return result; } int main() { int i; //freopen("test.txt","r",stdin); scanf("%d%d%d",&l,&t,&o); initfill(1,1,l); for(i=0;i<o;i++) { do { odder = getchar(); } while( odder!='C' && odder!='P' ); if(odder=='C') { scanf("%d%d%d",&a,&b,&c); color = COLOR(c); if(a>b) { temp = a; a = b; b = temp; } update(1,a,b); }else { scanf("%d%d",&a,&b); if(a>b) { temp = a; a = b; b = temp; } printf("%d\n",getColorKindNum( getcolor(1,a,b) ) ); } } return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator