洛谷 P3901 數列找不同 莫隊

2021-10-23 19:23:56 字數 2278 閱讀 5481

題目描述

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

q 。第二行,n

nn 個整數 a1,

a2,…

,a

na_1, a_2, \ldots , a_n

a1​,a2

​,…,

an​ 。接下來 q

qq 行,每行兩個整數 li,

ri

l_i,r_i

li​,ri

​ 。輸出格式

對每個詢問輸出一行,yesno

輸入輸出樣例

輸入 #1

421

2321

324

輸出 #1

yes

no

說明/提示

對於 50

%50\%

50% 的資料,n,q

≤103

n,q \le 10^3

n,q≤10

3 。對於 100

%100\%

100%

的資料,1≤n

,q≤1

05,1

≤ai≤

n,1≤

li≤r

i≤

n1 \le n,q \le 10^5,1 \le a_i \le n,1 \le l_i \le r_i \le n

1≤n,q≤

105,

1≤ai

​≤n,

1≤li

​≤ri

​≤n 。

題意:給出許多區間查詢,判斷區間中所有的數是否互不相同,是則輸入yes,否則輸出no

思路:基礎莫隊題。

**如下:

#include

using

namespace std;

const

int maxn =

1e5+5;

int a[maxn]

;int pos[maxn]

;bool ans[maxn]

;//第幾個詢問的區間中是否每個數都互不相同

int cnt[maxn]

;//記錄區間[l,r]中的每個數的出現次數

struct q q[maxn]

;//題目詢問的是區間[l,r]中的所有數是否互不相同,轉換為

//[l,r]中互不相同的數的個數是否等於區間大小r-l+1,等於則互不相同,否則存在相同的數

int res =0;

//[l,r]中互不相同的數的個數

void

add(

int n)

//出現了乙個不同的數,res++

void

sub(

int n)

//失去了乙個不同的數,res--

intmain()

for(

int i =

0; i < m;

++i)

sort

(q, q + m,

(const q &a,

const q &b));

int l =

1, r =0;

for(

int i =

0; i < m;

++i)

for(

int i =

0; i < m;

++i)

printf

("%s\n"

, ans[i]

?"yes"

:"no");

return0;

}

莫隊 P3901 數列找不同

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

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

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

模板 莫隊 P3901 數列找不同

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