bzoj2120
帶修莫隊的做法:
把所有修改也離線下來
新建乙個tk指標表示進行了k次修改,然後對於每個詢問記錄一下它之前有多少次修改,記為k,處理這個詢問時如果當前修改次數小於k,那麼就把tk往上滾,並進行修改,如果大於k,就把tk往下滾,並回溯修改
code:
#include
using
namespace std;
inline
intread()
while
(isdigit
(ch)
)return res*f;
}const
int n=
10005
;int pos[n]
,last[n]
;int n,m,a[n]
,sqr;
int ans[n]
,cnt[n]
;int cntq,cnto;
struct qq[n]
;struct opop[n]
;inline
bool
cmp(q a,q b)
char ss;
intmain()
sort
(q+1
,q+cntq+
1,cmp)
;int tl=
0,tr=
0,tk=
0,tot=0;
for(
int i=
1;i<=cntq;i++
) a[op[tk]
.x]=op[tk]
.y;}
while
(tk>q[i]
.k) a[op[tk]
.x]=op[tk]
.z;--tk;
}while
(tl!--cnt[a[tl++]]
)--tot;
while
(tl>l)if(
!cnt[a[
--tl]]++
)++tot;
while
(tr!cnt[a[
++tr]]++
)++tot;
while
(tr>r)if(
!--cnt[a[tr--]]
)--tot;
ans[q[i]
.id]
=tot;
}for
(int i=
1;i<=cntq;i++
) cout<<<
'\n'
;return0;
}
數顏色(莫隊帶修)
數顏色題目鏈結 帶修改的莫隊,關於時間複雜度的分析沒仔細看,但是這是乙個能實現更改的離線操作,感覺在之前的維度上加了一維 時間維度,可以將狀態向前或者向後改變,而時間的變遷也用while來更新,以達到操作目的,sort規則也變成這樣 return qu a.l qu b.l qu a.r qu b....
數顏色 維護佇列(帶修莫隊)
一直想學這個演算法,但是沒有碰見類似的於是就作罷 今天忽然看到這道題有點感覺,搞一搞 感覺帶修莫隊其實不是特別深奧難懂的 只是在原有的基礎上加了乙個時間軸 我比較喜歡在struct裡面寫過載 struct mo return l q n 這樣就排好序了,大致的也沒啥,直接上 看看就很容易懂的哦 in...
帶修莫隊 bzoj2120 數顏色
塊大小為n2 3。把詢問和修改分開。每次兩個詢問之間的修改進行暴力轉移,如果修改在上一次詢問的區間裡,就會對當前狀態形成影響。好慢。include include include includeusing namespace std define n 10001 int num n n,m,b n ...