zoukankan      html  css  js  c++  java
  • 主席树求区间不同数个数(模板)

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    typedef unsigned long long ull;
    int dir[8][2]={{1,0},{0,1},{1,1},{1,-1},{-1,1},{-1,-1},{0,-1},{-1,0}};
    #define pi acos(-1)
    #define me0(s) memset(s,0,sizeof(s))
    #define me1(s) memset(s,1,sizeof(s))
    #define mef(s) memset(s,-1,sizeof(s))
    #define meinf(s) memset(s,inf,sizeof(s))
    #define inf 1e18
    const int N=1e6+6;
    inline int read() {
        char c=getchar(); int x=0, f=1;
        while(c<'0'|c>'9') {if(c=='-') f=-1;c=getchar();}
        while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
        return x*f;
    }
    ll exgcd(ll a,ll b){
        if(b==0) return a;
        exgcd(b,a%b);
    }
    ll q_pow(ll a,ll b,ll mod){
        ll anss=1;
        while(b){
            if(b&1) anss=anss*a%mod;
            a=a*a%mod;
            b>>=1;
        }
        return anss;
    }
    ll q_mul(ll a,ll b,ll mod){
        ll anss=0;
        while(b){
            if(b&1) anss=(anss+a)%mod;
            a=(a+a)%mod;
            b>>=1;
        }
        return anss;
    }
    int n,q,tot;
    int h[N],pos[N*4];
    int ls[N*20],rs[N*20],siz[N*20];
    void update(int &rt,int pre,int k,int val,int l,int r){
        rt=++tot;
        ls[rt]=ls[pre];
        rs[rt]=rs[pre];
        siz[rt]=siz[pre]+val;
        if(l==r) return ;
        int m=(l+r)>>1;
        if(k<=m) update(ls[rt],ls[pre],k,val,l,m);
        else update(rs[rt],rs[pre],k,val,m+1,r);
    }
    int query(int L,int R,int l,int r,int rt){
        if(L<=l&&r<=R){
            return siz[rt];
        }
        int m=(l+r)>>1,ans=0;
        if(m>=L) ans+=query(L,R,l,m,ls[rt]);
        if(m<R) ans+=query(L,R,m+1,r,rs[rt]);
        return ans;
    }
    int main(int argc, char * argv[]) 
    {
        ios::sync_with_stdio(false);
        tot=0;
        cin>>n;
        for(int i=1;i<=n;i++){
            int c;
            cin>>c;
            if(pos[c]){
                update(h[i],h[i-1],pos[c],-1,1,n);
                update(h[i],h[i],i,1,1,n);
            }
            else update(h[i],h[i-1],i,1,1,n);
            pos[c]=i;
        }
        int q;
        while(q--){
            int l,r;
            cin>>l>>r;
            cout<<query(l,r,1,n,h[r])<<endl;
        }
        return 0;
    }
  • 相关阅读:
    python 中 repr() 与str() 区别
    python高级特性 知识 架构总结
    python 递归 之加特技 汉诺塔
    python 递归 反转字符串
    git 的使用
    vim 常用命令
    ubuntu下零基础建站之python基础环境搭建
    Oracle 分组统计,抽取每组前十
    SQL Server2008知识点总结
    java 连接sql server2008配置
  • 原文地址:https://www.cnblogs.com/wushengyang/p/11331512.html
Copyright © 2011-2022 走看看