gym卡了莫隊,於是趁這個機會學一下莫隊
莫隊的核心是分塊排序,這種特殊的排序方法將任務按排序後的順序完成,可以在解決絕大多數無修改的離線區間問題中極大的優化時間(優化了sqrt ( n )左右)。
nbut - 1457
題意:n個數,尋問10000次,任意區間內的相等數的次數的立方和。
題解:將n個數離散化後,用莫隊將詢問分塊排序,暴力計算出答案,在按原順序輸出結果。
#include#include#include#include#include#define ll long long
using namespace std;
ll n,a[100007],t,head,maze,size,ak[100007],num[100007],ans[100007],b[100007];
struct madokama[100007];
long long int qpow(long long int x,long long int n)
x=x*x;
x=x;
n>>=1;
} return res;
}bool cmp(madoka a1,madoka a2)
while(r>ma[i].r)
while(lcodeforces - 220b
題意:n個數,尋問10000次,任意區間內的相等數的次數與其數相等的個數。
題解:與上題差不多,但有個坑要注意下,離散化後會導致值改變,所以某數的次數要與它離散化前比較,之後便是莫隊板子。
#include#include#includeusing namespace std;
int n,m,t,a[100007],b[100007],num[100007],size,maze,head,ak[100007],ans[100007];
struct madokama[100007];
bool cmp(madoka a1,madoka a2)
num[a[r]]--;
if(num[a[r]]==b[a[r]])
r--;
} while(l>ma[i].l)
num[a[l]]++;
if(num[a[l]]==b[a[l]])
} while(lcodeforces - 940f
題意:給乙個長度n陣列,a陣列記錄值,q次操作,兩種操作,一種修改a+p位置的值,一種算 l , r 區間的值的個數的mex(mex指,如果有s個相等的數,那s是好的,然後你要輸出最小的不好的。如mex=3,說明區間內有相等的數的個數為1的存在,為2的存在,為3的不存在)。
題解:傳送門
#include#include#include#include#includeusing namespace std;
int n,q,ans[200007],a[200007],b[200007],l,r,z,size,head,maze,ak[200007],num[200007],cnt[200007];
vectorlsh,qans;
struct madokaho[200007],lin;
vectorma;
bool cmp(madoka a1,madoka a2)
while(lma[i].l)
while(p=ho[p].p)
a[ho[p].p]=ho[p].r;
} while(p>ma[i].p)
if(ma[i].l<=ho[p].p&&ma[i].r>=ho[p].p)
a[ho[p].p]=ho[p].l;
p--;
} for(int j=1;j<=n;j++)
} }}int main()
head+=size;
} for(int i=1;i<=n;i++)
for(int i=1;i<=q;i++)
else
} for(int i=1;i<=n;i++)a[i]=b[i];
dis();
sort(ma.begin(),ma.end(),cmp);
go();
for(int i=0;i}
基礎莫隊演算法
最好是會一點線段樹,不會也沒有關係 我們都知道,維護區間資訊的時候通常會用到各種線段樹,因為其本身具有的性質可以在很快的速度內完成各種操作。但是這是基於我們上推 pushup 和下推 pushdown 這兩種操作可以在o 1 的時間內完成的基礎。如果這兩個操作本身需要的時間不是常數級別的化我們可能需...
( 其他演算法與技巧 ) 莫隊
其他演算法與技巧 莫隊 推薦閱讀 在使用莫隊時總有些題目卡莫隊,這時候就需要用到奇偶優化 快讀來進行提速。struct node q 200005 int rule node a,node b q i l read q i r read q i bl q i l 1 sqrt n 2 1 首先明確 ...
樹上莫隊演算法
繼續回來寫部落格 記錄點有意思的題目什麼的。貌似寫過這個的沒多少人 所以我也記錄一點。首先序列上的莫隊大家都應該很熟悉了 那麼樹上的莫隊要怎麼搞呢?先來看個題目 spoj cot2 求樹上兩點間路徑上有多少個不同的點權。序列上的莫隊是把詢問按照左端點分塊了 可是樹上沒有左端點,怎麼辦呢?我們把樹分塊...