Count Color Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 40402 Accepted: 12186
Description
Chosen Problem Solving and Program design as an optional course, you are required to solve all kinds of problems. Here, we get a new problem.Input
First line of input contains L (1 <= L <= 100000), T (1 <= T <= 30) and O (1 <= O <= 100000). Here O denotes the number of operations. Following O lines, each contains "C A B C" or "P A B" (here A, B, C are integers, and A may be larger than B) as an operation defined previously.Output
Ouput results of the output operation in order, each line contains a number.Sample Input
2 2 4 C 1 1 2 P 1 2 C 2 2 2 P 1 2
Sample Output
2 1
Source
POJ Monthly--2006.03.26,dodo題目大意:一個長度為L的區間,最多有T種顏色,並且有O種操作,接下去有o行。
一共就兩種操作:1、C a b c:表示的是將【a,b】這個區間染成顏色c。 2、P a b :表示的是詢問【a,b】這個區間有多少種顏色。
解題思路:這個題目需要注意的是不能一直更新到最下面,就更新到符合的區間即可,否則會超時。
詳見代碼。
#include#include #include #include #include #include using namespace std; struct node { int l,r; int num; } s[400010]; int vis[35]; void InitTree(int l,int r,int k) { s[k].l=l; s[k].r=r; s[k].num=1; int mid=(l+r)/2; if (l==r) return ; InitTree(l,mid,2*k); InitTree(mid+1,r,2*k+1); } void UpdataTree(int l,int r,int c,int k) { if(s[k].l==l&&s[k].r==r) { s[k].num=c; return; } if (s[k].num==c) return; if (s[k].num!=-1)//如果所查詢的區間不是多種顏色 { s[2*k].num=s[k].num;//更新區間的顏色 s[2*k+1].num=s[k].num; s[k].num=-1;//-1表示該區間有多種顏色 } int mid=(s[k].l+s[k].r)/2; if (l>mid) UpdataTree(l,r,c,2*k+1); else if (r<=mid) UpdataTree(l,r,c,2*k); else { UpdataTree(l,mid,c,2*k); UpdataTree(mid+1,r,c,2*k+1); } } void SearchTree(int l,int r,int k) { if (s[k].num!=-1) { vis[s[k].num]=1; return; } int mid=(s[k].l+s[k].r)/2; if (r<=mid) SearchTree(l,r,2*k); else if (l>mid) SearchTree(l,r,2*k+1); else { SearchTree(l,mid,2*k); SearchTree(mid+1,r,2*k+1); } } int main() { int l,t,o,ans; while (~scanf("%d%d%d",&l,&t,&o)) { InitTree(1,l,1); while (o--) { char ch; int a,b,c; getchar(); scanf("%c",&ch); if (ch=='C') { scanf("%d%d%d",&a,&b,&c); if (a>b) swap(a,b); UpdataTree(a,b,c,1); } else { scanf("%d%d",&a,&b); if (a>b) swap(a,b); memset(vis,0,sizeof(vis)); SearchTree(a,b,1); ans=0; for (int i=1; i<=t; i++) if (vis[i]==1) ans++; printf ("%d\n",ans); } } } return 0; }