1. 程式人生 > 其它 >數列找不同

數列找不同

題目:

https://www.luogu.com.cn/problem/P3901

#include<bits/stdc++.h>
#include<stdio.h>
using namespace std;
const int maxn=1e5+7;
int n,m,block,belong[maxn],arr[maxn],has[maxn],ans[maxn];
inline int gcd(int a, int b)
{ int r; while (b > 0) { r = a % b; a = b; b = r; }return a; }
struct Q
{
    
int l,r,id; bool operator <(const Q &b) { if(belong[l]!=belong[b.l]) return l<b.l; else return r<b.r; } }query[maxn]; int L,R; int ret=0; int fa=0; int s=0; inline void add(int x) { ++has[x]; if(has[x]>1) ret=1;
if(has[x]==2) s++; } inline void del(int x) { --has[x]; if(has[x]==1&&s==1) ret=0,s--; else if(has[x]==1) s--; } //從[L,R]轉移到[l,r] /* void GetNew(int l,int r,int L,int R) { while(R<r) add(arr[++R]); while(L>l) add(arr[--L]); while(R>r) del(arr[R--]); while(L<l) del(arr[L++]); }
*/ int main() { scanf("%d%d",&n,&m); block=sqrt(n); for(int i=1;i<=n;++i) { scanf("%d",&arr[i]); belong[i]=(i-1)/block+1; } int cnt=0; int ans[maxn]; for(int i=1;i<=m;++i) { int l,r; scanf("%d%d",&l,&r); query[i]={l,r,i}; } sort(query+1,query+m+1); // L=1; for(int i=1;i<=m;++i) { int l=query[i].l; int r=query[i].r; int id=query[i].id; //auto[l,r,id]=query[i]; while(R<r) add(arr[++R]); while(L>l) add(arr[--L]); while(R>r) del(arr[R--]); while(L<l) del(arr[L++]); //printf("ret=%d\n",ret); ans[id]=ret; } for(int i=1;i<=m;++i) { if(!ans[i]) printf("Yes\n"); else printf("No\n"); } }