• POJ–2104 K-th Number


    主席树。

    主席树复习,这道题是主席树的经典入门了吧。。

    无修改区间第k大。

    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    const int maxn = 200000 + 10;
    const int maxm = 5000000 + 10;
    
    /*
    void build(int &x,int L,int R) {
        if(!x) x=++vid;
        if(L==R) return;
        int mid = (L+R)>>1;
        build(lc[x],L,mid);
        build(rc[x],mid+1,R);
    }*/
    
    int root[maxn];
    int lc[maxm],rc[maxm],s[maxm],vid;
    int n,m,q,cur;
    int a[maxn],t[maxn];
    
    void modify(int &x,int y,int L,int R,int pos,int val=1) {
        x=++vid; s[x]=s[y]+val;
        lc[x]=lc[y]; rc[x]=rc[y];    
        if(L==R) return;
        int mid = (L+R)>>1;
        if(pos<=mid) modify(lc[x],lc[y],L,mid,pos);
        else modify(rc[x],rc[y],mid+1,R,pos);
    }
    
    int query(int x,int y,int k) {
        int l=1,r=m;
        while(l<r) {
            cur=s[lc[x]]-s[lc[y]];
            int mid=(l+r)>>1;
            if(k<=cur) {
                x=lc[x]; y=lc[y]; r=mid;     
            }
            else {
                x=rc[x]; y=rc[y]; l=mid+1; k-=cur;
            }
        }
        return l;
    }
    
    int l,r,k;
    
    int main() {
        scanf("%d%d",&n,&q);
        for(int i=1;i<=n;i++) {
            scanf("%d",&a[i]);
            t[i]=a[i];
        }
        //printf("test
    ");
        sort(t+1,t+n+1);
        m=unique(t+1,t+n+1)-(t+1);
        for(int i=1;i<=n;i++) a[i]=lower_bound(t+1,t+m+1,a[i])-t;
        for(int i=1;i<=n;i++) modify(root[i],root[i-1],1,m,a[i]);
        while(q--) {
            scanf("%d%d%d",&l,&r,&k);
            printf("%d
    ",t[query(root[r],root[l-1],k)]);
        }
        return 0;
    }
  • 相关阅读:
    ORACLE 计算时间相减间隔
    oracle中游标详细用法
    oracle中计算某月的天数
    Unity3D导出的EXE不用显示分辨率选择界面
    Unity3D 之暂停和继续的实现
    double的值太大,以及补0
    Unity3D鼠标点击物体产生事件
    java POi excel 写入大批量数据
    Unity3D 判断鼠标是否按在UGUI上
    Unity3D 之UGUI 滚动条
  • 原文地址:https://www.cnblogs.com/invoid/p/5689803.html
Copyright © 2020-2023  润新知