zoukankan      html  css  js  c++  java
  • 莫队大法好

    无修改的离线区间问题处理(乱搞)神器——莫队

    洛谷P3901 数列找不同

    #include<bits/stdc++.h>
    #define IL inline
    #define R register int
    
    using namespace std;
    const int N=1e5+5,inf=0x3f3f3f3f;
    
    IL int read() {
        int f=1;
        char ch;
        while((ch=getchar())<'0'||ch>'9') if(ch=='-') f=-1;
        int res=ch-'0';
        while((ch=getchar())>='0'&&ch<='9') res=res*10+ch-'0';
        return res*f;
    }
    
    int n,m,len,cnt[N],curl,curr,ans,a[N];//curl=1和curl=0皆可
    bool o[N];
    struct hh {
        int l,r,id;
        bool operator <(const hh &a) const {
            if(l/len==a.l/len) return r<a.r;
            return l<a.l;
        }
    } q[N];
    
    void add(int x) {
        if((++cnt[a[x]])==1) ans++;
    }
    
    void del(int x) {
        if(--(cnt[a[x]])==0) ans--;
    }
    
    int main() {
        n=read();
        m=read();
        len=sqrt(n);
        for(R i=1; i<=n; ++i) a[i]=read();
        for(R i=1; i<=m; ++i) q[i].l=read(),q[i].r=read(),q[i].id=i,o[i]=0;
        sort(q+1,q+1+m);
    
        for(R i=1; i<=m; ++i) {
            while(q[i].l>curl) del(curl++);
            while(q[i].l<curl) add(--curl);
            while(q[i].r>curr) add(++curr);
            while(q[i].r<curr) del(curr--);
            if(ans==(q[i].r-q[i].l+1)) o[q[i].id]=1;
        }
        for(R i=1; i<=m; ++i)
            if(o[i]) puts("Yes");
            else puts("No");
        return 0;
    }
    P3901代码

    洛谷P2709 小B的询问

    #include<bits/stdc++.h>
    #define int long long
    #define IL inline
    #define R register int
    
    using namespace std;
    const int N=1e5+5,inf=0x3f3f3f3f;
    
    IL int read() {
        int f=1;
        char ch;
        while((ch=getchar())<'0'||ch>'9') if(ch=='-') f=-1;
        int res=ch-'0';
        while((ch=getchar())>='0'&&ch<='9') res=res*10+ch-'0';
        return res*f;
    }
    
    int n,m,len,cnt[N],curl=1,curr,ans,a[N],k;//注意!curl=1
    int o[N];
    struct hh {
        int l,r,id;
        bool operator <(const hh &a) const {
            if(l/len==a.l/len) return r<a.r;
            return l<a.l;
        }
    } q[N];
    
    void add(int x) {
        ans+=2*cnt[a[x]]+1;
        cnt[a[x]]++;
    }
    
    void del(int x) {
        ans-=2*cnt[a[x]]-1;//完全平方展开
        cnt[a[x]]--;
    }
    
    signed main() {
        n=read();
        m=read();
        k=read();
        len=sqrt(n);
        for(R i=1; i<=n; ++i) a[i]=read();
        for(R i=1; i<=m; ++i) q[i].l=read(),q[i].r=read(),q[i].id=i;
        sort(q+1,q+1+m);
        for(R i=1; i<=m; ++i) {
            while(curl<q[i].l) del(curl++);
            while(curl>q[i].l) add(--curl);
            while(curr<q[i].r) add(++curr);
            while(curr>q[i].r) del(curr--);
            o[q[i].id]=ans;
        }
        for(R i=1; i<=m; ++i) printf("%lld
    ",o[i]);
        return 0;
    }
    P2709代码

    洛谷P4462 [CQOI2018]异或序列

    #include<bits/stdc++.h>
    #define int long long
    #define IL inline
    #define R register int
    
    using namespace std;
    const int N=2e5+5,inf=0x3f3f3f3f;
    
    IL int read() {
        int f=1;
        char ch;
        while((ch=getchar())<'0'||ch>'9') if(ch=='-') f=-1;
        int res=ch-'0';
        while((ch=getchar())>='0'&&ch<='9') res=res*10+ch-'0';
        return res*f;
    }
    
    int n,m,len,cnt[N],curl=1,curr,ans,a[N],k;
    int o[N];
    struct hh {
        int l,r,id;
        bool operator <(const hh &a) const {
            if(l/len==a.l/len) return r<a.r;
            return l<a.l;
        }
    } q[N];
    
    void add(int x) {
        ans+=cnt[a[x]^k];
        cnt[a[x]]++;//顺序Attention!
    }
    
    void del(int x) {
        cnt[a[x]]--;
        ans-=cnt[a[x]^k];
    }
    
    //区间:[l-1,r]
    signed main() {
        n=read();
        m=read();
        k=read();
        len=sqrt(n);
        for(R i=1; i<=n; ++i) a[i]=read(),a[i]^=a[i-1];
        for(R i=1; i<=m; ++i) q[i].l=read()-1,q[i].r=read(),q[i].id=i;//Attention!q[i].l--;
        sort(q+1,q+1+m);
        for(R i=1; i<=m; ++i) {
            while(curl<q[i].l) del(curl++);
            while(curl>q[i].l) add(--curl);
            while(curr<q[i].r) add(++curr);
            while(curr>q[i].r) del(curr--);
            o[q[i].id]=ans;
        }
        for(R i=1; i<=m; ++i) printf("%lld
    ",o[i]);
        return 0;
    }
    P4462代码

    CF617E XOR and Favorite Number (同上一题,数据范围有所变化)

    洛谷P1972 [SDOI2009]HH的项链(著名卡莫队题,然鹅我还是用莫队卡过了,感谢讨论帖的好心人!)

    #include<bits/stdc++.h>
    //#define int long long
    #define IL inline
    #define R register int
    
    using namespace std;
    const int N=1e6+5,inf=0x3f3f3f3f;
    
    IL int read() {
        int f=1;
        char ch;
        while((ch=getchar())<'0'||ch>'9') if(ch=='-') f=-1;
        int res=ch-'0';
        while((ch=getchar())>='0'&&ch<='9') res=res*10+ch-'0';
        return res*f;
    }
    
    int n,m,len,cnt[N],curl=1,curr,ans,a[N],k,b[N];
    int o[N];
    struct hh {
        int l,r,id;
        bool operator <(const hh &a) const {
            if(b[l]==b[a.l]) 
                if(b[l]&1) return r<a.r;
                else return r>a.r;
            return l<a.l;
        }//奇偶性排序
    } q[N];
    
    void add(int x) {
        cnt[a[x]]++;
        ans+=cnt[a[x]]==1;//少用if也会变快
    }
    
    void del(int x) {
        cnt[a[x]]--;
        ans-=cnt[a[x]]==0;
    }
    
    int main() {
        n=read();
        len=sqrt(n);
        for(R i=1; i<=n; ++i) a[i]=read(),b[i]=(i-1)/len+1;//预处理b数组会更快
        m=read();
        for(R i=1; i<=m; ++i) q[i].l=read(),q[i].r=read(),q[i].id=i;
        sort(q+1,q+1+m);
        for(R i=1; i<=m; ++i) {
            while(curl<q[i].l) del(curl++);
            while(curl>q[i].l) add(--curl);
            while(curr<q[i].r) add(++curr);
            while(curr>q[i].r) del(curr--);
            o[q[i].id]=ans;
        }
        for(R i=1; i<=m; ++i) printf("%d
    ",o[i]);
        return 0;
    }
    P1972代码

    SP3267 DQUERY - D-query(上一题的弱化版,然鹅至今未过,一直在waiting)

    洛谷P1494 [国家集训队]小Z的袜子

    #include<bits/stdc++.h>
    #define int long long
    #define IL inline
    #define R register int
    
    using namespace std;
    const int N=1e5+5,inf=0x3f3f3f3f;
    
    IL int read() {
        int f=1;
        char ch;
        while((ch=getchar())<'0'||ch>'9') if(ch=='-') f=-1;
        int res=ch-'0';
        while((ch=getchar())>='0'&&ch<='9') res=res*10+ch-'0';
        return res*f;
    }
    
    int n,m,len,cnt[N],curl,curr,ans,a[N],k;
    int gcd(int x,int y) {return y?gcd(y,x%y):x;}
    struct Ans {
        int x,y;
        void out() {
            if(!x) puts("0/1");
            else {
                int d=gcd(x,y);
                x/=d;y/=d;
                printf("%lld/%lld
    ",x,y);
            }
        }
    }o[N];
    struct hh {
        int l,r,id;
        bool operator <(const hh &a) const {
            if(l/len==a.l/len) return r<a.r;
            return l<a.l;
        }
    } q[N];
    
    void add(int i) {
        if(cnt[a[i]]>0) ans+=cnt[a[i]]*(cnt[a[i]]+1)-cnt[a[i]]*(cnt[a[i]]-1);//也可以这样写:ans+=cnt[a[i]]*2;
        cnt[a[i]]++;
    }
    
    void del(int i) {
        if(cnt[a[i]]>1) ans+=(cnt[a[i]]-1)*(cnt[a[i]]-2)-cnt[a[i]]*(cnt[a[i]]-1);//也可以这样写:ans-=(cnt[a[i]]-1)*2;
        cnt[a[i]]--;
    }
    
    signed main() {
        n=read();
        m=read();
        len=sqrt(n);
        for(R i=1; i<=n; ++i) a[i]=read();
        for(R i=1; i<=m; ++i) q[i].l=read(),q[i].r=read(),q[i].id=i;
        sort(q+1,q+1+m);
        for(R i=1; i<=m; ++i) {
            while(curl<q[i].l) del(curl++);
            while(curl>q[i].l) add(--curl);
            while(curr<q[i].r) add(++curr);
            while(curr>q[i].r) del(curr--);
            o[q[i].id]=(Ans){ans,(q[i].r-q[i].l+1)*(q[i].r-q[i].l)};
        }
        for(R i=1; i<=m; ++i) o[i].out();
        return 0;
    }
    P1494代码

     

  • 相关阅读:
    JAVA集合类汇总
    springmvc执行流程详细介绍
    java文件上传和下载
    Java中的Filter过滤器
    JSTL介绍及使用
    JSP知识汇总
    JAVA集合类汇总
    服务治理框架dubbo中zookeeper的使用
    map进程数量和reduce进程数量
    Hadoop的序列化
  • 原文地址:https://www.cnblogs.com/ljy-endl/p/14584172.html
Copyright © 2011-2022 走看看