也不說了直接上板子
#include
using namespace std;
struct quesq[200010];//結構體存每個詢問,注意要記錄詢問順序以便輸出
const int block=1300;//分的塊大小
int a[30010],ans[200010],res=0;//a陣列資料,ans存各個詢問答案,res當前左右端點答案
void add(int
pos)//加入新點
void del(int
pos)//刪除點
bool cmp(ques a,ques b)//排序比較函式
while(nowl>q[i].l)//往左,類似
while(nowr>q[i].r)//當前大於詢問右端點,往左刪除
while(nowl
ans[q[i].id]=res;//存下該次詢問答案
}//輸出,略
}//這裡需要注意的是4個while迴圈一般先搞新增再搞刪除,以免l到r右邊產生奇怪錯誤
題意:給乙個串,裡面一堆整數,再給出一堆詢問,問給定區間不相同數的個數.
資料範圍(串中數數量<=30000,每個數大小<=1000000,詢問數<=200000)
裸題,莫隊板子貼上去就行,複雜度詢問數*根號(數的數量)
#include
using namespace std;
struct quesq[200010];
const int block=1300;int a[30010],belong[30010],ans[200010],res=0;int vis[1000010]=;
void add(int
pos)
void del(int
pos)
bool cmp(ques a,ques b)
while(nowl>q[i].l)
while(nowr>q[i].r)
while(nowl
ans[q[i].id]=res;
}for(int i=1;i<=m;i++)
printf("%d\n",ans[i]);
}
模板 莫隊演算法
題意 給定乙個大小為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 不斷調...
莫隊演算法模板
一道簡單的莫隊演算法題 莫隊的一般寫法 codeforces 86d include define pb push back define mp make pair using namespace std const int maxn 2e5 7 typedef long long ll struc...