luogu-P3901

题目大意为:给出一个序列,然后在k个查询区间中,如果该区间中的序列中没有相同的数,那么就输出yes,否则输出no。

这道题也是一道莫队的模板题,但是因为我将分块是除以len写成了除以n,导致后面五个样例点直接T了,所以莫队的效率还是挺靠分块的大小的,(虽然我写成n之后就相当于没分块了,呜嘤呜嘤)。
代码:

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e6+7;
inline int read()
{
    int x=0,f=1;
    char c;
    c=getchar();
    while(!isdigit(c))
    {
        if(c=='-')f=-1;
        c=getchar();
    }
    while(isdigit(c)){
        x=x*10+c-'0';
        c=getchar();
    }
    return x*f;
}
int num[maxn],f[maxn],ans[maxn],cnt=0;
struct node
{
    int l,r,id,pos;
    bool operator <(node &a)const {
        return pos==a.pos? r<a.r : pos<a.pos;
    }
}q[maxn];
void add(int x)
{
    f[num[x]]++;
    if(f[num[x]]==1)cnt++;
}
void del(int x)
{
    f[num[x]]--;
    if(f[num[x]]==0)cnt--;
}
int main()
{
    int n,m,len;
    n=read(),m=read();
    len=sqrt(n);
    for(int i=1;i<=n;i++) num[i]=read();
    for(int i=1;i<=m;i++) q[i].l=read(),q[i].r=read(),q[i].id=i,q[i].pos=(q[i].l-1)/len+1;
    sort(q+1,q+1+m);
    int l=1,r=0;
    for(int i=1;i<=m;i++){
        int x=q[i].l,y=q[i].r;
        while(l<x)del(l),l++;
        while(l>x)l--,add(l);
        while(r<y)r++,add(r);
        while(r>y)del(r),r--;
        ans[q[i].id]=(cnt==r-l+1)?1:0;
    }
    for(int i=1;i<=m;i++){
        if(ans[i])printf("Yes\n");
        else printf("No\n");
    }
    return 0;
}
发布了34 篇原创文章 · 获赞 3 · 访问量 255

猜你喜欢

转载自blog.csdn.net/qq_44641782/article/details/103182342