莫隊 優雅的暴力演算法

2021-08-21 14:34:01 字數 1047 閱讀 3665

例題

牛客暑期訓練營 j

題意描述:

輸入一串整數(n<=1e5),對於每個詢問(i,j),輸出a[1]…a[i]以及a[j]…a[n]裡數字的種類數,詢問一共q個(<=n)

思路分析:

暴力解法,即對於每個詢問均通過遍歷尋找答案,會令複雜度高達o(n^2),考慮對其進行優化。

我們知道對於詢問(i,j),去掉i對結果造成的影響加上j對結果造成的影響,在o(1)內就變為了詢問(i+1,j+1),在這種情況下的拖慢程式的,是詢問的無序性,如果第一次詢問的左下標為1,第二次就變為了n-1,就會讓該演算法無法發揮其優勢。故考慮對詢問進行排序。

排序採用分塊排序的原則,按照左下標的位置進行分塊,左下標相同則對右下標進行公升序排列,可以證明這樣一來該演算法的整體複雜度為o(n*unit+n*n/unit),根據基本不等式,令unit塊的大小為n^0.5式取到最小值n^1.5,這裡給出做出完整證明的一篇文章  。

接下來是本題**,很遺憾直到最後依然有re沒有調出來,測試通過率50%,不過看到有一段也用了這個演算法的成功ac,**思路基本相同,先只當過了吧……

//j

#include#include#include#includeusing namespace std;

int ans[100001],a[100001],cnt[100001];

int ln,rn;

const int block=520;

int n,q,sum;

struct query

sort(qaq+1,qaq+1+q);

sum=0;

ln=qaq[1].l;

rn=qaq[1].r;

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

add(a[i]);

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

add(a[i]);

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

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

cout<}

return 0;

}

優雅的區間問題暴力 莫隊演算法

對dalao口中可以 o n 區間內絕大部分無修改離線問題的莫隊演算法,一直處於 好騎 的狀態,最近終於找到了學習的機會,其實感覺,這著實是乙個優雅的暴力。莫隊演算法的大前提,是可以利用已知的 l,r 內的答案,直接得到 l,r 1 l 1,r l 1,r l,r 1 上的答案。以下內容預設上述轉移...

莫隊演算法 普通莫隊 智慧型暴力例題模板

1 基礎莫隊演算法2.莫隊演算法實現 莫隊演算法把排序做了簡單的修改,就把暴力法的複雜度從o mn 提高到o n n 1 暴力法的排序 把查詢的區間按左端點排序,如果左端點相同,再按右端點排序。莫隊演算法的排序 把陣列分塊 分成 n塊 然後把查詢的區間按左端點所在塊的序號排序,如果左端點的塊相同,再...

化暴力為標算 莫隊

莫隊。這個聽起來非常高階的東西,當時聽大佬們說這個名詞就一臉害怕,學完發現其實也還好。之所以叫這個名字 因為發明者的緣故而已。和演算法本身並沒有什麼直接關係。莫隊就是用區間來優化暴力,可以把暴力的複雜度壓到n 1.5左右 當然,常數有多大我就不知道了 莫隊演算法的本質就是暴力列舉。對於m個詢問,就是...