這個坑終於填了…
上文接這裡
這就是莫隊(確信)
先放個可離線的題:
可離線:給你個序列,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...