P3901 数列找不同 莫队模板题

题目描述

现有数列 A1​,A2​,…,AN​,Q个询问 (Li​,Ri​),ALi​​,ALi​+1​,…,ARi​​ 是否互不相同。

输入格式

第一行,两个整数N,Q。
第二行,NN 个整数A1​,A2​,…,AN​。
接下来 Q 行,每行两个整数 Li​,Ri​。

输出格式

对每个询问输出一行,Yes 或 No

输入输出样例

输入 #1

4 2
1 2 3 2
1 3
2 4

输出 #1

Yes
No

说明/提示

对于 50% 的数据,N,Q≤103。
对于 100% 的数据,1≤N,Q≤10^5,1≤Ai​≤N,1≤Li​≤Ri​≤N。

 

#include<bits/stdc++.h>
using namespace std;
#define int long long
typedef double db;
const int N=1e5+10;
int n,q1,ans;
int a[N],Ans[N],vis[N];
struct Q
{
    int l,r,id,pos;
} q[N];
int cmp(Q a,Q b)
{
    return a.pos==b.pos ? a.r<b.r : a.pos<b.pos;
}
void add(int x)
{
    if(vis[a[x]]==1) ans++;
    vis[a[x]]++;
}
void removes(int x)
{
    vis[a[x]]--;
    if(vis[a[x]]==1) ans--;
}
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    cin>>n>>q1;
    for(int i=1; i<=n; i++)
    {
        cin>>a[i];
    }

    int siz=(int)sqrt(n);

    for(int i=1; i<=q1; i++)
    {
        cin>>q[i].l>>q[i].r;
        q[i].id=i;
        q[i].pos=(q[i].l-1)/siz+1;
    }
    sort(q+1,q+1+q1,cmp);
    int l=1,r=0;
    for(int i=1; i<=q1; i++)
    {
        while(l>q[i].l)add(--l);
        while(r<q[i].r)add(++r);
        while(l<q[i].l)removes(l++);
        while(r>q[i].r)removes(r--);
        Ans[q[i].id]=ans;

    }

    for(int i=1; i<=q1; i++)
    {
        if(Ans[i])cout<<"No"<<"\n";
        else cout<<"Yes"<<"\n";
    }










    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值