莫隊演算法模板

2021-08-11 05:20:54 字數 2077 閱讀 5262

一道簡單的莫隊演算法題:

莫隊的一般寫法:

// codeforces 86d

#include

#define pb push_back

#define mp make_pair

using

namespace

std;

const

int maxn=2e5+7;

typedef

long

long ll;

struct mop[maxn];

ll a[maxn];

ll f[1000007];

ll ans[maxn];

int n,q;

ll now=0;

bool

operator

void add(int x)

int main()

int q=700;

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

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

int l=1,r=0;

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

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

return

0;}

稍難一點的莫隊(莫隊+分塊)

別人的題解:

我的**:

// uestc - 1753

#include

#define pb push_back

#define mp make_pair

using

namespace

std;

const

int maxn=1e5+7,maxm=1e6+7;

typedef

long

long ll;

//快速讀入

inline

void read(int &n)

//快速輸出

inline

void write(int x)

if(!x)

int len=0; for(;x;x/=10) s[len++]=x % 10+'0';

for(int i=len-1;i>=0;--i) putchar(s[i]);

} struct mop[maxm];

int ans[maxm];

int n,m;

struct partpart[maxn];

int f[maxn],s[maxn];

int ntop[maxn];

int q;

bool

operator

void dec(int x)

int get_ans(int l,int r)

return res;

}for(i=l+1;i<=r-1;++i)

res+=part[i].num;

for(i=l;i<=part[l].r;++i)

if(f[i]) res++;

for(i=part[r].l;i<=r;++i)

if(f[i]) res++;

return res;

}void doit_mo()

}int main()

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

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

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

sort(p+1,p+1+m);

doit_mo();

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

write(ans[i]),putchar('\n');

/*for(i=1;i<=m;++i)

printf("%d\n",ans[i]);

*/return

0;}

————————

關於分塊的方法:

用劉大爺的話說,第一種滿足基本複雜度,第二種在m很大時更優

————————

當帶上修改時:

模板 莫隊演算法

題意 給定乙個大小為n的陣列,陣列中所有元素的大小 n。你需要回答m個查詢。每個查詢的形式是l,r,k。你需要回答在範圍 l,r 中至少重複k次的數字的個數。n,m 100000 誒,這題卡了好久,tle,中間棄了一段,然後今天學弟學莫隊,拿出這個題,他也沒什麼想法,然後我頓時退一步海闊天空了。最開...

模板 莫隊演算法

這個演算法是由之前的國家隊隊長莫濤巨神 orz 發明的,所以尊稱莫隊演算法。如果我們知道區間 l,r 就能在o 1 求出 l 1,r l 1,r l,r 1 l,r 1 的話,那就可以用莫隊演算法了。1 排序,以左段點所在的塊為第一關鍵字,以右端點為第二關鍵字 2 從左往右處理詢問 離線 3 不斷調...

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

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