zoukankan      html  css  js  c++  java
  • 【洛谷P3901】数列找不同

    题目大意:给定一个长度为 N 的序列,每个点被染了一个颜色。现有 M 个询问,每个询问查询区间 [l,r] 内的点是否颜色都是不同的。

    题解:莫队裸题。
    直接维护区间颜色数,用 cnt[] 记录下区间中颜色出现的次数,用 now 记录下区间颜色数,查询时只需比较区间颜色数和区间长度的关系即可。

    代码如下

    #include <bits/stdc++.h>
    #define fi first
    #define se second
    #define pb push_back
    #define mp make_pair
    #define all(x) x.begin(),x.end()
    using namespace std;
    typedef long long ll;
    typedef pair<int,int> P;
    const int dx[]={0,1,0,-1};
    const int dy[]={1,0,-1,0};
    const int mod=1e9+7;
    const int inf=0x3f3f3f3f;
    const int maxn=1e5+10;
    const double eps=1e-6;
    inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
    inline ll sqr(ll x){return x*x;}
    inline ll read(){
        ll x=0,f=1;char ch;
        do{ch=getchar();if(ch=='-')f=-1;}while(!isdigit(ch));
        do{x=x*10+ch-'0';ch=getchar();}while(isdigit(ch));
        return f*x;
    }
    /*--------------------------------------------------------*/
    
    int n,m,tot,now,a[maxn],cnt[maxn],ans[maxn];
    struct query{int id,bl,l,r;}q[maxn];
    bool cmp(const query &x,const query &y){return x.bl==y.bl?(x.bl&1)?x.r<y.r:x.r>y.r:x.bl<y.bl;}
    
    void read_and_parse(){
        n=read(),m=read(),tot=sqrt(n);
        for(int i=1;i<=n;i++)a[i]=read();
        for(int i=1;i<=m;i++)q[i].l=read(),q[i].r=read(),q[i].id=i,q[i].bl=(q[i].l-1)/tot+1;
        sort(q+1,q+m+1,cmp);
    }
    
    inline void update(int pos,int val){
        if(val==1){
            if(cnt[a[pos]]==0)++now;
            cnt[a[pos]]+=val;
        }else{
            if(cnt[a[pos]]==1)--now;
            cnt[a[pos]]+=val;
        }
    }
    
    void solve(){
        for(int i=1,l=1,r=0;i<=m;i++){
            while(r<q[i].r)update(r+1,1),++r;
            while(r>q[i].r)update(r,-1),--r;
            while(l<q[i].l)update(l,-1),++l;
            while(l>q[i].l)update(l-1,1),--l;
            ans[q[i].id]=now==q[i].r-q[i].l+1?1:0;
        }
        for(int i=1;i<=m;i++)puts(ans[i]?"Yes":"No");
    }
    
    int main(){
        read_and_parse();
        solve();
        return 0;
    }
    
    
  • 相关阅读:
    C/C++多文件之间的变量定义
    PKU POJ 2186 Popular Cows 强连通分量
    重载函数
    ZOJ 2763 Prison Break
    201357 训练赛总结
    hdu 4467 Graph 构造
    201356 训练赛总结
    201353 NEERC 2012, Eastern subregional contest
    2013512 CF 183 总结
    一道动态规划
  • 原文地址:https://www.cnblogs.com/wzj-xhjbk/p/10656374.html
Copyright © 2011-2022 走看看