P3901 数列找不同

P3901 数列找不同

询问一个区间的数是否互不相同。

直接莫队区间数颜色。

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=10000005,M=10000005;
int read(){
    int x=0,f=1;char ch=getchar();
    while(ch>'9'||ch<'0'){if(ch=='-'){f=-1;}ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
    return x*f;
}
int a[N],pos[N],n,m,ANS[N],ans=1,cnt[N],num[N],A[N];
struct node{
    int l,r,id;
}q[N];
bool cmp(node x,node y){
    if(pos[x.l]==pos[y.l]) return x.r<y.r;
    return pos[x.l]<pos[y.l];
}
void update(int id,int f){
    if(f==1){
        num[cnt[a[id]]]--;
        num[cnt[a[id]]+1]++;
        cnt[a[id]]++;
        if(cnt[a[id]]>ans) ans=cnt[a[id]];
    }
    else{
        num[cnt[a[id]]]--;
        if(num[ans]==0) ans--;
        num[cnt[a[id]]-1]++;
        cnt[a[id]]--;
    }
    return ;
}
int main(){
    n=read(),m=read();
    int op=sqrt(n);
    for(int i=1;i<=n;i++){
        A[i]=read();
        a[i]=A[i];
        pos[i]=i/op;
    }
    sort(A+1,A+n+1);
    int nn=unique(A+1,A+n+1)-A-1;
    for(int i=1;i<=n;i++) a[i]=lower_bound(A+1,A+nn+1,a[i])-A;
    for(int i=1;i<=m;i++){
        q[i].l=read(),q[i].r=read(),q[i].id=i;
    }
    sort(q+1,q+m+1,cmp);
    for(int i=1,l=1,r=0;i<=m;i++){
        while(l<q[i].l) update(l++,-1);
        while(l>q[i].l) update(--l,1);
        while(r<q[i].r) update(++r,1);
        while(r>q[i].r) update(r--,-1);

        ANS[q[i].id]=ans;
    }
    for(int i=1;i<=m;i++){
        if(ANS[i]>1){
            cout<<"No"<<endl;
        }
        else cout<<"Yes"<<endl;
    }
    return 0;
}

posted @ 2021-04-21 20:41  __Anchor  阅读(46)  评论(0编辑  收藏  举报