一道簡單的莫隊演算法題:
莫隊的一般寫法:
// 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塊 然後把查詢的區間按左端點所在塊的序號排序,如果左端點的塊相同,再...