現有數列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 21 2 3 2
1 32 4
輸出 #1複製
yesno
• 對於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,...