• 莫队暴力 一知半解


    区间找种类吧

    一个区间,给你好多区间,然后问有多少种;

    分块优化,将区间询问分块处理

    然后两个指针一样的东西,走遍天下顺便把答案给你;

    所以指针直接从头走到尾岂不是时间很优,所以要把询问区间排序

    看不懂还是看大神博客吧

    https://www.cnblogs.com/WAMonster/p/10118934.html

    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    const int maxn=1000000;
    struct node
    {
        int l,r,id;
    }qu[maxn];
    int n,q,a[maxn];
    int len,tot,b[maxn];
    int cnt[maxn],ll=1,rr=0,now=0;
    bool cmp(node x,node y)
    {
        if(b[x.l]==b[y.l]) return x.r<y.r;
        else return x.l<y.l;
    }
    /*int cmp(node x,node y) {
        return (b[x.l] ^ b[y.l]) ? b[x.l] < b[y.l] : ((b[x.l] & 1) ? x.r < y.r : x.r > y.r);
    }*/
    
    void add(int pos)
    {
        if(!cnt[a[pos]]) ++now;
        ++cnt[a[pos]];
    }
    
    void del(int pos)
    {
        --cnt[a[pos]];
        if(!cnt[a[pos]]) now--;
    }
    
    int ans[maxn];
    int main()
    {
        scanf("%d",&n);
        len=sqrt(n);
        tot=n/len;
        if(n%len) tot++;
        
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
            b[i]=(i-1)/len+1;
        }
        
        scanf("%d",&q);
        for(int i=1;i<=q;i++)
        {
            scanf("%d%d",&qu[i].l,&qu[i].r);
            qu[i].id=i;
        }
        sort(qu+1,qu+q+1,cmp);
        for(int i=1;i<=q;i++)
        {
            int ql=qu[i].l;
            int qr=qu[i].r;
            while(ll<ql) del(ll++);
            while(ll>ql) add(--ll);
            while(rr>qr) del(rr--);
            while(rr<qr) add(++rr);
            ans[qu[i].id]=now; 
        }
        for(int i=1;i<=q;i++) printf("%d
    ",ans[i]);
        return 0;
    }
  • 相关阅读:
    重写方法,重载方法,虚方法和抽象方法的使用
    基类和派生类
    C#修饰符讲解大全
    通过HTTP请求WEBAPI的方式
    计算机各种协议讲解
    时间戳
    SQL Server知识详解
    基本概念和术语
    22.C++- 继承与组合,protected访问级别
    22.QT-QXmlStreamReader解析,QXmlStreamWriter写入
  • 原文地址:https://www.cnblogs.com/WHFF521/p/11178373.html
Copyright © 2020-2023  润新知