bzoj1878 HH的項鍊(莫隊)

2021-08-22 02:42:40 字數 1447 閱讀 6116

這篇部落格簡要介紹下我對莫隊的理解。

莫隊是一種複雜度為o(n*sqrt(n))的演算法。具體思路是「通過區間左端點的左移和右移與區間右端點的左移和右移來進行更新」,排序的時候進行分塊操作,目的是減少左移右移的次數。分塊的話假設序列個數是n,那麼就分為sqrt(n)塊,然後根據塊進行排序(就是先將要查詢的所有區間輸入,離線處理,然後儲存後進行按塊排序)

下面就是乙個例子:

time limit: 4 sec  memory limit: 64 mb

submit: 6699  solved: 3298

[submit][status][discuss]

hh有一串由各種漂亮的貝殼組成的項鍊。hh相信不同的貝殼會帶來好運,所以每次散步 完後,他都會隨意取出一

段貝殼,思考它們所表達的含義。hh不斷地收集新的貝殼,因此他的項鍊變得越來越長。有一天,他突然提出了一

個問題:某一段貝殼中,包含了多少種不同的貝殼?這個問題很難回答。。。因為項鍊實在是太長了。於是,他只

好求助睿智的你,來解決這個問題。

第一行:乙個整數n,表示項鍊的長度。 

第二行:n個整數,表示依次表示項鍊中貝殼的編號(編號為0到1000000之間的整數)。 

第三行:乙個整數m,表示hh詢問的個數。 

接下來m行:每行兩個整數,l和r(1 ≤ l ≤ r ≤ n),表示詢問的區間。

n ≤ 50000,m ≤ 200000。

m行,每行乙個整數,依次表示詢問對應的答案。

61 2 3 4 3 5

31 2

3 52 622

4day2

這道題限制是4秒,所以莫隊也是可以做的。但是有的評測限制了時間是1秒,這樣莫隊就會超時了。

bzoj上是可以的。

注意:val記錄的是顏色的個數。起初我陣列開小了,一直wa,也可以直接離散化處理

#includeusing namespace std;

const int maxn=50010;

const int maxm=200010;

int n,m,block;

int val[1000010],s[maxn],pos[maxm];

int ans[maxm];

struct nodeq[maxm];

int cmp(node a,node b)

}while(rigq[i].rig)

}ans[q[i].id]=ans;

}return ;

}int main()

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

scanf("%d",&m);

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

sort(q+1,q+1+m,cmp);

solve();

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

return 0;

}

BZOJ 1878 HH的項鍊(莫隊演算法)

description hh有一串由各種漂亮的貝殼組成的項鍊。hh相信不同的貝殼會帶來好運,所以每次散步完後,他都會隨意取出一段貝殼,思考它們所表達的含義。hh不斷地收集新的貝殼,因此,他的項鍊變得越來越長。有一天,他突然提出了乙個問題 某一段貝殼中,包含了多少種不同的貝殼?這個問題很難回答。因為項...

BZOJ 1878 hh的項鍊(簡單莫隊)

hh有一串由各種漂亮的貝殼組成的項鍊。hh相信不同的貝殼會帶來好運,所以每次散步 完後,他都會隨意取出一 段貝殼,思考它們所表達的含義。hh不斷地收集新的貝殼,因此他的項鍊變得越來越長。有一天,他突然提出了一 個問題 某一段貝殼中,包含了多少種不同的貝殼?這個問題很難回答。因為項鍊實在是太長了。於是...

樹狀陣列 BZOJ1878 HH的項鍊

hh有一串由各種漂亮的貝殼組成的項鍊。hh相信不同的貝殼會帶來好運,所以每次散步 完後,他都會隨意取出一段貝殼,思考它們所表達的含義。hh不斷地收集新的貝殼,因此,他的項鍊變得越來越長。有一天,他突然提出了乙個問題 某一段貝殼中,包含了多少種不同 的貝殼?這個問題很難回答。因為項鍊實在是太長了。於是...