2120: 数颜色
Time Limit: 6 Sec Memory Limit: 259 MBSubmit: 6102 Solved: 2420
[Submit][Status][Discuss]
Description
墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问。墨墨会像你发布如下指令: 1、 Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔。 2、 R P Col 把第P支画笔替换为颜色Col。为了满足墨墨的要求,你知道你需要干什么了吗?
Input
第1行两个整数N,M,分别代表初始画笔的数量以及墨墨会做的事情的个数。第2行N个整数,分别代表初始画笔排中第i支画笔的颜色。第3行到第2+M行,每行分别代表墨墨会做的一件事情,格式见题干部分。
Output
对于每一个Query的询问,你需要在对应的行中给出一个数字,代表第L支画笔到第R支画笔中共有几种不同颜色的画笔。
Sample Input
6 5
1 2 3 4 5 5
Q 1 4
Q 2 6
R 1 2
Q 1 4
Q 2 6
1 2 3 4 5 5
Q 1 4
Q 2 6
R 1 2
Q 1 4
Q 2 6
Sample Output
4
4
3
4
4
3
4
HINT
对于100%的数据,N≤10000,M≤10000,修改操作不多于1000次,所有的输入数据中出现的所有整数均大于等于1且不超过10^6。
2016.3.2新加数据两组by Nano_Ape
Source
一道快要把laj做哭的题目=_= (突然发现laj现在脾气越来越不稳定了 _(:зゝ∠)_)
带修改的莫队……一开始还以为就是啥跟一般的莫队一样一样的呢… _(:зゝ∠)_
其实带修改的莫队也很简单,对于每一个询问维护一个time记录在这次询问前总共做了几次修改,再开一个结构体记录修改的操作即可……思路都是对的哇……为啥一开始调程序调到怀疑人生……
1 #include "bits/stdc++.h" 2 using namespace std; 3 typedef long long LL; 4 const int MAX=1e5+5; 5 int n,m,ans,ttt,tot,N,L,R,bas; 6 int a[MAX],d[MAX],b[1000005],pos[MAX],an[MAX]; 7 struct Node{ 8 int id,l,r,tim; 9 bool operator < (const Node &tt) const{ 10 if (pos[l]!=pos[tt.l]) 11 return pos[l]<pos[tt.l]; 12 if (pos[r]!=pos[tt.r]) 13 return r<tt.r; 14 return tim<tt.tim; 15 } 16 }que[MAX]; 17 struct Upd{int x,y,last;}upd[MAX]; 18 inline int read(){ 19 int an=0,x=1;char c=getchar(); 20 while (c<'0' || c>'9') {if (c=='-') x=-1;c=getchar();} 21 while (c>='0' && c<='9') {an=an*10+c-'0';c=getchar();} 22 return an*x; 23 } 24 void update(int x,int y){ 25 b[a[x]]+=y; 26 if (b[a[x]]==0) ans--; 27 if (b[a[x]]==1 && y==1) ans++; 28 } 29 void change(int now,int i){ 30 if (que[i].l<=upd[now].x && upd[now].x<=que[i].r){ 31 b[a[upd[now].x]]--; 32 if (b[a[upd[now].x]]==0) ans--; 33 if (b[upd[now].y]==0) ans++; 34 b[upd[now].y]++; 35 } 36 swap(a[upd[now].x],upd[now].y); 37 } 38 int main(){ 39 freopen ("count.in","r",stdin);freopen ("count.out","w",stdout); 40 int i,j;char c;L=1; 41 n=read(),m=read();bas=(int)sqrt(n*1.0); 42 for (i=1;i<=n;i++) a[i]=read(),pos[i]=i/bas; 43 for (i=1;i<=m;i++){ 44 while (c=getchar(),c<'A' || c>'Z'); 45 if (c=='R'){ 46 upd[++tot].x=read(); 47 upd[tot].y=read(); 48 } 49 else{ 50 que[++ttt].id=ttt; 51 que[ttt].l=read(),que[ttt].r=read(); 52 que[ttt].tim=tot; 53 } 54 } 55 sort(que+1,que+ttt+1); 56 for (i=1;i<=ttt;i++){ 57 while (R<que[i].r) ++R,update(R,1); 58 while (L>que[i].l) --L,update(L,1); 59 while (R>que[i].r) update(R,-1),--R; 60 while (L<que[i].l) update(L,-1),++L; 61 while (N<que[i].tim) ++N,change(N,i); 62 while (N>que[i].tim) change(N,i),--N; 63 an[que[i].id]=ans; 64 } 65 for (i=1;i<ttt;i++) 66 printf("%d ",an[i]); 67 printf("%d",an[ttt]); 68 return 0; 69 }