zoukankan      html  css  js  c++  java
  • P2617 Dynamic Rankings(树状数组套主席树)

    P2617 Dynamic Rankings

    单点修改,区间查询第k大

    当然是无脑树套树了~

    树状数组套主席树就好辣

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define rint register int
    using namespace std;
    void read(int &x){
        char c=getchar();x=0;
        while(c<'0'||c>'9') c=getchar();
        while('0'<=c&&c<='9') x=x*10+(c^48),c=getchar();
    }
    #define N 200005
    #define W 60000005
    int n,m,p1[N],p2[N],p3[N],a[N],tn,b[N];
    int u,rt[N],lc[W],rc[W],siz[W],tx,ty,X[N],Y[N];
    #define mid (l+r)/2
    void ins(int &o,int l,int r,int x,int v){
        if(!o) o=++u;
        siz[o]+=v;
        if(l==r) return ;
        if(x<=mid) ins(lc[o],l,mid,x,v);
        else ins(rc[o],mid+1,r,x,v);
    }
    int Ask(int l,int r,int k){
        if(l==r) return b[l];
        int re=0;
        for(rint i=1;i<=tx;++i) re-=siz[lc[X[i]]];
        for(rint i=1;i<=ty;++i) re+=siz[lc[Y[i]]];
        if(k<=re){
            for(rint i=1;i<=tx;++i) X[i]=lc[X[i]];
            for(rint i=1;i<=ty;++i) Y[i]=lc[Y[i]];
            return Ask(l,mid,k);
        }else{
            for(rint i=1;i<=tx;++i) X[i]=rc[X[i]];
            for(rint i=1;i<=ty;++i) Y[i]=rc[Y[i]];
            return Ask(mid+1,r,k-re);
        }
    }
    void add(int x,int v){
        int k=lower_bound(b+1,b+tn+1,a[x])-b;
        for(int i=x;i<=n;i+=i&-i) ins(rt[i],1,tn,k,v); 
    }
    int main(){
        read(n);read(m); char opt[3];
        for(rint i=1;i<=n;++i) read(a[i]),b[++tn]=a[i];
        for(rint i=1;i<=m;++i){
            scanf("%s",opt); read(p1[i]),read(p2[i]);
            if(opt[0]=='Q') read(p3[i]);
            else b[++tn]=p2[i];
        }sort(b+1,b+tn+1);
        tn=unique(b+1,b+tn+1)-b-1;//离散化
        for(rint i=1;i<=n;++i) add(i,1);
        for(rint i=1;i<=m;++i){
            if(p3[i]){
                tx=ty=0;
                for(int j=p1[i]-1;j;j-=j&-j) X[++tx]=rt[j];
                for(int j=p2[i];j;j-=j&-j) Y[++ty]=rt[j];
                printf("%d
    ",Ask(1,tn,p3[i]));
            }else{
                add(p1[i],-1);
                a[p1[i]]=p2[i];
                add(p1[i],1);
            }
        }
    }
  • 相关阅读:
    【转】ON_COMMAND ON_MESSAGE ON_NOTIFY区别与联系
    Eureka
    application.yml-mysql8
    sprigcloud
    springboot
    maven
    排序算法之基数排序
    排序算法之桶排序
    排序算法之计数排序
    排序算法之堆排序
  • 原文地址:https://www.cnblogs.com/kafuuchino/p/10665146.html
Copyright © 2011-2022 走看看