題目描述
現有數列 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
。輸出格式
對每個詢問輸出一行,yes
或no
。
輸入輸出樣例
輸入 #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 詢問的方法,但是這不重要,還是先練練莫隊吧 演算法競賽 高階指南 裡面沒有專門講莫隊,學得就有一丟丟麻煩 簡單說,莫隊就是 優雅的暴力 首先要注意 莫隊是離線演算法 我們把詢問分成...