根號類演算法講解 各 四 種莫隊 填坑

2021-08-20 19:22:52 字數 3568 閱讀 6736

這個坑終於填了…

上文接這裡

這就是莫隊(確信)

先放個可離線的題:

可離線:給你個序列,m次詢問(可離線)一段區間有多少個不同的數(可離線)(資料範圍105105

)可離線

相信各位都已經拿高效的ds秒掉了

相信大家看完題目第一感覺就是離線(

考慮兩次詢問區間(l

,r) (l,

r)和(l′,r′

) (l′

,r′)

,假設我們已經處理出(l

,r) (l,

r)區間內的答案,考慮將其拓展到(l

也就是要將左端點從

l l

移動到l′

' role="presentation">l′l

′,右端點從

r r

移動到r′

' role="presentation">r′r

′,乙個數乙個數的移動,複雜度就是o(

|l′−

l|+|

r′−r

|)o (|

l′−l

|+|r

′−r|

)對於每個詢問用這種方法拓展到下乙個詢問,就可以求出所有的答案啦!

(這**不就是暴力嗎(╯`□′)╯┴—┴

上面的做法隨便想想都是o(

n2) o(n

2)的… 那該怎麼辦(傻*博主舉報了

對詢問離線,將區間分為n−

−√n

塊,將詢問以

1.左端點在同一塊中的,按右端點排序;

2.左端點不在同一塊中的,按左端點所在塊排序;

之後再進行剛才說的暴力,複雜度就變成

n1.5

n

1.5的啦!

1.左端點在同一塊中的詢問:

乙個塊中最多有

n n

個詢問,每次左端點最多移動

n' role="presentation">n−−

√n次,右端點一共移動最多

n n

次(因為右端點已經從小到大排好序),所以複雜度o(

n1.5

)' role="presentation">o(n

1.5)o(

n1.5

)(就是左端點移動的總複雜度)

2.左端點不再同一塊中的詢問:

最多跨n−−

√ n

塊,每次跨越左端點最多移動n−

−√n

次,右端點最多移動

n n

次,所以總複雜度

n1.5

' role="presentation">n

1.5n

1.5包含1,2兩種情況的證明類似,複雜度一樣

n1.5

n

1.5(說了這麼多,我選擇nlogn的ds

0.能用莫隊過

1.能將詢問離線

2.可以往外拓展收縮

說了這麼多,回到剛才的小例題,直接看**吧

#include

#include

#include

#include

#define n 200050

using

namespace

std;

inline

int read()

int n,m,block_size;

int block[n],a[n],ans[n],l=1,r;///l=1,r=0代表初始狀態(空區間)

int cnt[1000050],tmp;

struct queryq[n];///問題

inline

bool cmp(query a,query b)

inline

void update(int x,int k)

int main()

m=read();

for(int i=1;i<=m;i++)

sort(q+1,q+m+1,cmp);///對詢問排序

for(int i=1;i<=m;i++)

for(int i=1;i<=m;i++)

return

0;}

可如果有些問題帶修改,怎麼辦?

帶修莫隊在原先的二維拓展(l,r)上增加了乙個時間維(t),在移動的時候也要移動t使得時間也滿足限制

剩下的內容就和普通莫隊一樣了

複雜度玄學o(

n53)

o (n

53)題我這個月一定補上!

樹上莫隊其實就是將樹化為區間後進行普通莫隊

首先弄出一棵樹的括號序(入棧時候記一次,出棧時候記一次)

就比如這棵樹

括號序是abccbdeeffda

對每個點記錄兩次出現的位置(設為

s s

和t' role="presentation">tt)

對於每組詢問(x

,y) (x,

y)(設x x

比y' role="presentation">y

y深度小):

1.如果兩個點在一條鏈上(

x x

是y' role="presentation">y

y祖先),答案為(x

.t,y

.t) (x.

t,y.

t)2.否則,答案為(x.s,y.t)+lca(x,y)

區間內出現兩次的節點資訊抵消

yy一下發現並沒有什麼問題,所以是對的(

有些題維護的資訊加乙個元素簡單刪乙個難….

就需要回滾莫隊

這個我還沒寫過(我這個月一定寫),我看了別人的講解自己口胡一下

就是設左端點在這個塊內的詢問,右端點的集合為

s s

,你可以通過處理下乙個塊最左面的點到

s' role="presentation">s

s的答案,再由它向左延伸得到這個塊內的答案

沒寫過,這幾天寫寫,有錯誤就回來改

聚類的四種演算法

最近看了一篇 涉及到資料探勘的聚類演算法,這裡總結一下 一 聚類演算法的簡介 聚類演算法是一種典型的無監督學習演算法,主要用於將相似的樣本自動歸到乙個類別中。聚類演算法與分類演算法最大的區別是 聚類演算法是無監督的學習演算法,而分類演算法屬於監督的學習演算法。在聚類演算法中根據樣本之間的相似性,將樣...

四種排序演算法PHP實現類

四種排序演算法的php實現 1 插入排序 insertion sort 的基本思想是 每次將乙個待排序的記錄,按其關鍵字大小插入到前面已經排好序的子檔案中的適當位置,直到全部記錄插入完成為止。2 選擇排序 selection sort 的基本思想是 每一趟從待排序的記錄中選出關鍵字最小的記錄,順序放...

Sort List(四種演算法)

sort a linked list in o nlog n time using constant space complexity.演算法一 快速排序。因為鍊錶是單向,所以有很多細節要注意,比如quick sort p,r 排序的區間其實是 p next,r next 因為單向鍊錶不能回頭。de...