數列找不同

2022-08-24 20:18:12 字數 1410 閱讀 4280

現有數列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

using

namespace

std;

const

int maxn=100010

;inline

intread()

ch=getchar();

}while(ch>='

0'&&ch<='9'

)

return s*w;

}int n,m,hhh,ans=0

,kkksc03,kkksc04,cnt[maxn],a[maxn],i;

bool

anb[maxn];

struct

nodeq[maxn];

bool cmp(const node x,const

node y)

void add(int

position)

}void remove(int

position)

}int

main()

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

sort(q+1,q+1+m,cmp);

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

while(kkksc03>l)

while(kkksc04while(kkksc04>r)

if(ans==(r-l+1

)) }

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

else

}return0;

}

數列找不同

題目描述 現有數列a 1,a 2,cdots,a na 1 a 2 a n q 個詢問 l i,r i l i r i a a cdots,a a li a li 1 a ri 是否互不相同 輸入格式 第1 行,2 個整數n,qn,q 第2 行,n 個整數a a cdots,a a li a li ...

luogu 數列找不同 莫隊

了解過莫隊的人應該都清楚,莫隊是乙個優化的暴力,可以在相對暴力比較優的時間中,求出一段序列內的某些性質 例 數字的種類 那麼這道題就明顯是一道模板題了,在l,r 左右段點 移動的過程中,記錄數字的種類,若種類數等於r l 1,那麼表明沒有重複。include include include incl...

P3901 數列找不同

題意 每次詢問乙個區間裡的數是否各不相同 顯然,當乙個區間裡的數各不相同時,它們的種數就是區間的長度 莫隊可以快速地求出區間的顏色種數,因此強制離線計算即可 include using namespace std const int n 100005 int n,q,a n block,ans 0,...