可惜没如果=_=
时光的河入海流

2120: 数颜色

Time Limit: 6 Sec  Memory Limit: 259 MB
Submit: 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

Sample Output

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\n",an[i]);
67     printf("%d",an[ttt]);
68     return 0;
69 }

 

posted on 2017-10-23 21:15  珍珠鸟  阅读(223)  评论(0编辑  收藏  举报