莫隊 P3901 數列找不同

2021-09-25 05:20:36 字數 1454 閱讀 4507

現有數列a_1,a_2,\cdots,a_na1​,a2​,⋯,an​,q 個詢問(l_i,r_i)(li​,ri​),a_ ,a_,\cdots,a_ali​,ali+1​,⋯,ari​ 是否互不相同

輸入格式:

第1 行,2 個整數n,qn,q

第2 行,n 個整數a_ ,a_,\cdots,a_ali​,ali+1​,⋯,ari​

q 行,每行2 個整數l_i,r_ili​,ri​

輸出格式:

對每個詢問輸出一行,「yes」 或者「no」

輸入樣例#1:複製

4 2

1 2 3 2

1 32 4

輸出樣例#1:複製

yes

no

• 對於50% 的資料,n,q \le 10^3n,q≤103

• 對於100% 的資料,1 \le n,q \le 10^5, 1 \le a_i \le n, 1 \le l_i \le r_i \le n1≤n,q≤105,1≤ai​≤n,1≤li​≤ri​≤n

#include#include#include#include#include#include#include#include#define inf 0x3f3f3f3f

#define ll long long

const int maxn = 2e7+5;

using namespace std;

int a[maxn],ans[maxn];int block;

struct nodepp[maxn];

bool cmp(node a,node b)

int res ;//記錄不符合標記的數目

int book[maxn];

void reves(int k,int v)//k是當前要更新的位置v代表1為增加-1減少

book[u]++;

}else

book[u]--;

}}int main()

int l = 1,r = 0;//最左邊的不相交的

for(register int i = 0;i < q;++i)

sort(pp,pp+q,cmp);

for(register int i = 0;i < q;++i)

while(l < pp[i].l)

while(pp[i].r < r)

while(pp[i].r > r)

ans[pp[i].step] = res;

}//莫隊

for(register int i = 0;i < q;++i)

else

}//輸出答案

return 0;

}

P3901 數列找不同(簡單莫隊)

莫隊入門題目,區間不相同數查詢 應該用線段樹也能做,但是不知道該維護什麼。一篇很好的題解 莫隊演算法主要解決的問題 莫隊演算法是用來處理一類無修改的離線區間詢問問題。莫隊演算法的思想 1 分塊and排序,使相鄰的查詢區間盡量接近,curl和curr兩個指標移動的距離盡量少 2 桶排查找 1 incl...

模板 莫隊 P3901 數列找不同

目錄 模板 莫隊 p3901 數列找不同 傳送門沒有專門的模板,就把這道題作為模板啦 聽說這題有o n 預處理,o 1 詢問的方法,但是這不重要,還是先練練莫隊吧 演算法競賽 高階指南 裡面沒有專門講莫隊,學得就有一丟丟麻煩 簡單說,莫隊就是 優雅的暴力 首先要注意 莫隊是離線演算法 我們把詢問分成...

洛谷 P3901 數列找不同 莫隊

題目描述 現有數列 a1,a2,a na 1,a 2,ldots,a n a1 a2 an q qq 個詢問 li ri l i,r i li r i 詢問 ali ali 1,ari a a ldots,a ali ali 1 ar i 是否互不相同。輸入格式 第一行,兩個整數 n,q n,qn,...