zoukankan      html  css  js  c++  java
  • POJ 2104 【主席树】【区间第K大】

    #include<stdio.h>
    #include<algorithm>
    #include<string.h>
    #define MAXN 100010
    #define MAXM 5050
    using namespace std;
    struct tr{
        int l,r,sum;
    };
    tr tree[MAXN*50];
    int root[MAXN];
    int cnt;
    int jilu[MAXN],from[MAXN];
    void updat(int s,int e,int &x,int y,int pos){
        tree[++cnt]=tree[y];
        x=cnt;
        tree[x].sum++;
        if(s==e)return;
        int mid=(s+e)>>1;
        if(mid>=pos)
            updat(s,mid,tree[x].l,tree[y].l,pos);
        else
            updat(mid+1,e,tree[x].r,tree[y].r,pos);
    }
    int query(int s,int e,int x,int y,int k){
        if(s==e)return s;
        int mid=(s+e)>>1;
        if(tree[tree[y].l].sum-tree[tree[x].l].sum>=k)
            return query(s,mid,tree[x].l,tree[y].l,k);
        else
            return query(mid+1,e,tree[x].r,tree[y].r,k-tree[tree[y].l].sum+tree[tree[x].l].sum);
    }
    int main()
    {
        int n,m;
        scanf("%d%d",&n,&m);
        for(int i=0;i<n;i++){
            scanf("%d",&jilu[i]);
            from[i]=jilu[i];
        }
        sort(jilu,jilu+n);
        int num=unique(jilu,jilu+n)-jilu;
        for(int i=0;i<n;i++){
            int id=upper_bound(jilu,jilu+num,from[i])-jilu;
            updat(1,num,root[i+1],root[i],id);
        }
        for(int i=0;i<m;i++){
            int a,b,c;
            scanf("%d%d%d",&a,&b,&c);
            printf("%d
    ",jilu[query(1,num,root[a-1],root[b],c)-1]);
        }
        return 0;
    }
  • 相关阅读:
    木马后门入侵与RKHunter,ClamAV检测工具
    Jenkins环境搭建
    Mha-Atlas-MySQL高可用
    JAVA企业级应用服务器之TOMCAT实战
    Keepalived高可用集群
    scp ssh-key连接原理
    jumpserver跳板机搭建
    DNS域名解析服务器
    DHCP服务
    Keepalived高可用集群
  • 原文地址:https://www.cnblogs.com/tun117/p/5520681.html
Copyright © 2011-2022 走看看