1. 程式人生 > >[bzoj2120] [洛谷P1903] 數顏色

[bzoj2120] [洛谷P1903] 數顏色

-- sample 原本 不同顏色 AI 部分 void -i scanf

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。


想法

帶修改莫隊。
與普通莫隊其實一個意思,就是多了一個tim表示在這個詢問操作時已進行了幾次修改。
進行一些修改操作使當前狀態與這個詢問時原本的狀態相同。


代碼

註意細節!!!

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath> using namespace std; const int N = 10005; int block; int bl(int x) { return (x-1)/block+1; } int cnt1,cnt2; struct ask{ int l,r,id,tim; bool operator < (const ask &b) const{ return bl(l)<bl(b.l) || (bl(l)==bl(b.l) && r<b.r); } }q[N]; struct
cg{ int x,fr,to; }d[N]; int a[N],cnt[1000005]; int cur,L,R; void add(int x){ cnt[a[x]]++; if(cnt[a[x]]==1) cur++; } void del(int x){ cnt[a[x]]--; if(cnt[a[x]]==0) cur--; } void cg_add(int x){ int id=d[x].x; if(L<=id && id<=R){ // 註意是id(即d[x].x)啊,並不是x del(id); a[id]=d[x].to; add(id); } else a[id]=d[x].to; } void cg_del(int x){ int id=d[x].x; if(L<=id && id<=R){ del(id); a[id]=d[x].fr; add(id); } else a[id]=d[x].fr; } int n,m; int ans[N]; int main() { char opt[1]; int x,y; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=m;i++){ scanf("%s",opt); scanf("%d%d",&x,&y); if(opt[0]==‘Q‘){ cnt1++; q[cnt1]=(ask){x,y,cnt1,cnt2}; } else{ cnt2++; d[cnt2]=(cg){x,a[x],y}; a[x]=y; } } block=sqrt(n); sort(q+1,q+cnt1+1); int t=cnt2; L=R=1; cnt[a[1]]++; cur=1; for(int i=1;i<=cnt1;i++){ while(R<q[i].r) add(++R); while(L>q[i].l) add(--L); while(R>q[i].r) del(R--); while(L<q[i].l) del(L++); while(t>q[i].tim) cg_del(t--); //註意順序!! while(t<q[i].tim) cg_add(++t); ans[q[i].id]=cur; } for(int i=1;i<=cnt1;i++) printf("%d\n",ans[i]); return 0; }

[bzoj2120] [洛谷P1903] 數顏色