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 |
线段树......................................贴代码................................................#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int MAX=100000; struct node { int left,right,cover; }; node tree[MAX*3]; bool used[31]; void built(int L,int R,int id)//建树 { tree[id].cover=1;//初始化颜色 tree[id].left=L; tree[id].right=R; if(L<R) { int mid=(L+R)/2; built(L,mid,2*id); //左子树 built(mid+1,R,2*id+1); //右子树 } } void insert(int id,int L,int R,int col) { if(tree[id].left>=L&&tree[id].right<=R) { tree[id].cover=col; return; } if(tree[id].left<tree[id].right) { int mid=(tree[id].left+tree[id].right)>>1; if(tree[id].cover>0) { tree[id*2].cover=tree[id].cover; tree[id*2+1].cover=tree[id].cover; } tree[id].cover=-1; if(R<=mid) insert(id*2,L,R,col); else if(L>mid) insert(id*2+1,L,R,col); else { insert(id*2,L,mid,col); insert(id*2+1,mid+1,R,col); } } } void cnt(int L,int R,int id) { if(tree[id].cover>0) { used[tree[id].cover]=true; return; } if(tree[id].left<tree[id].right) { int mid=(tree[id].left+tree[id].right)>>1; if(R<=mid) cnt(L,R,id*2); else if(L>mid) cnt(L,R,id*2+1); else { cnt(L,mid,id*2); cnt(mid+1,R,id*2+1); } } } int main() { int L,T,Q; scanf("%d %d %d",&L,&T,&Q); int i,x,y,c; built(1,L,1); while(Q--) { char ch[2]; scanf("%s",ch); if(ch[0]=='C') { scanf("%d %d %d",&x,&y,&c); if(x<=y) insert(1,x,y,c); else insert(1,y,x,c); } else { scanf("%d %d",&x,&y); memset(used,false,sizeof(used)); if(x<=y) cnt(x,y,1); else cnt(y,x,1); int ans=0; for(i=1;i<=T;i++) if(used[i])ans++; printf("%d\n",ans); } } return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator