解題思路:第一次做莫隊演算法,推薦部落格入門。
結合上面那片部落格,我先講一下自己對莫隊演算法時間複雜度的理解。首先我們將乙個block設為sqrt(n) ,n為數列的長度。然後按提的問題的區間進行排序,排序的規則是:
這麼做的目的是使l和r指標的移動複雜度盡可能相等。
1.首先對l的移動複雜度進行分析。l最複雜的情況就是最後要從數列首端移動到數列末端,複雜度為o(n),中間還會加一些o(m*block)的複雜度(即在乙個block中首尾反覆迴圈),這樣總的複雜度就是o(n+m*block)約等於o(n*biock)
2.再對r的複雜度進行分析。r在乙個區塊中的複雜度撐死o(n),由於有(n/block)個區塊,所以總的複雜度為o(n^2/block).當block=sqrt(n)時,l,r的複雜度均變成o(n*sqrt(n))
#include#include#include#include#define n 100009
using namespace std;
struct node
q[n];
int s[n],be[n],u,vis[n],ans,res[n];
bool cmp(node a,node b)
for(int i=1;i<=m;i++)
printf("%d\n",res[i]);
} return 0;
}
HDU4638 不帶修改莫隊演算法
hdu4638 題意 n個人,幾個人為一組的要求是號連續,每組價值是人數的平方,詢問m個區間回答每個區間分幾組能達到和最大。思路 明顯是一組人越多越好,那相當於問給定區間能分幾組的問題了,離線用莫隊演算法,把詢問存起來。需要注意的就是當前後兩個詢問區間沒有重疊部分的時候,如果先進行了刪除操作,那麼就...
hdu 4638 樹狀陣列
思路 將查詢區間按右節點的公升序排列,然後插入第i個數的時候,若nun i 1已經插入,那麼就update pre num i 1 1 pre表示的是該數的位置。同樣若 num i 1存在就update pre num i 1 1 因為他麼與num i 屬於一組,故只需乙個存在就行。當查詢的右邊界r...
莫隊演算法講解
問題 有n個數組成乙個序列,有m個形如詢問l,r的詢問,每次詢問需要回答區間內至少出現2次的數有哪些。樸素的解法需要讀取o nm 次數。如果資料範圍小,可以用陣列,時間複雜度為o nm 如果使用stl的map來儲存出現的次數,則需要o nmlogn 的複雜度。有沒有更快的方法呢?得出。如果能安排適當...