帶修莫隊 數顏色

2021-09-10 06:49:49 字數 1325 閱讀 9974

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 ...