刷題 洛谷 P3901 數列找不同

2022-05-26 02:48:06 字數 1293 閱讀 3465

現有數列 \(a_1,a_2,\cdots,a_n\) ,q 個詢問 \((l_i,r_i)\) , \(a_ ,a_,\cdots,a_\) 是否互不相同

輸入格式:

第1 行,2 個整數 \(n,q\)

第2 行,n 個整數 \(a_ ,a_,\cdots,a_\)​

q 行,每行2 個整數 \(l_i,r_i\)​

輸出格式:

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

輸入樣例#1:

4 21 2 3 2

1 32 4

輸出樣例#1:

yesno

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

• 對於100% 的資料, \(1 \le n,q \le 10^5, 1 \le a_i \le n, 1 \le l_i \le r_i \le n\)

當做莫隊裸題做了,加數和刪數的時候只要判之前或之後是不是一來更改某一段的貢獻

(這題還可以 \(o(n)\) 做,而且很好寫,不過為了寫個模板,就沒去寫了)

#include#define ui unsigned int

#define ll long long

#define db double

#define ld long double

#define ull unsigned long long

const int maxn=100000+10;

int n,q,a[maxn],unit,be[maxn],cnt[maxn],sum,ans[maxn];

struct node

templateinline void write(t x,char ch='\0')

templateinline void chkmin(t &x,t y)

templateinline t min(t x,t y)

inline void add(int x)

inline void del(int x)

int main()

std::sort(query+1,query+q+1);

int l=1,r=0;

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

for(register int i=1;i<=q;++i)puts(ans[i]?"no":"yes");

return 0;

}

《洛谷P3901 數列找不同》

提供兩種解法。第一種 直接對詢問離線,然後莫隊分塊。我們用乙個陣列vis來統計每個數出現的次數,然後維護區間內出現次數超過2的數量即可。一開始加了個vis i max vis i 0 防負數操作還wa了,這樣其實有點違背統計思想了。author levil includeusing namespac...

洛谷 P3901 數列找不同 思維

傳送門 給出n nn個數,以及q qq組詢問,對於li ri l i r i li ri 中所有數是否都是不相同的,如果是,就輸出yes yesye s,否則輸出nono no乙個很正常的思路就是對於每個區間都去判斷,但我們不妨換種思路,先預處理出對於每個位置符合條件的最右位置,然後在輸入範圍時就可...

P3901 數列找不同

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