zoukankan      html  css  js  c++  java
  • [HDU 2665&POJ 2104]K-th Number(主席树)

    Description

    Give you a sequence and ask you the kth big number of a inteval.

    Solution

    主席树模板题

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cstdlib>
    #define MAXN 100005
    using namespace std;
    int T,n,m,sz,tot;
    int a[MAXN],b[MAXN],rt[MAXN],ls[MAXN*20],rs[MAXN*20],sum[MAXN*20];
    int read()
    {
        int x=0,f=1;char c=getchar();
        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;
    }
    void build(int &idx,int l,int r)
    {
        ++tot,idx=tot;sum[idx]=0;
        if(l==r)return;
        int mid=(l+r)>>1;
        build(ls[idx],l,mid);
        build(rs[idx],mid+1,r);
    }
    void insert(int &idx,int l,int r,int last,int pos)
    {
        ++tot,idx=tot;
        ls[idx]=ls[last];
        rs[idx]=rs[last];
        sum[idx]=sum[last]+1;
        if(l==r)return;
        int mid=(l+r)>>1;
        if(pos<=mid)insert(ls[idx],l,mid,ls[last],pos);
        else insert(rs[idx],mid+1,r,rs[last],pos);
    }
    int query(int s,int t,int l,int r,int k)
    {
        if(l==r)return l;
        int cnt=sum[ls[t]]-sum[ls[s]];
        int mid=(l+r)>>1;
        if(cnt>=k)return query(ls[s],ls[t],l,mid,k);
        else return query(rs[s],rs[t],mid+1,r,k-cnt);
    }
    int main()
    {
        T=read();
        while(T--)
        {
            n=read(),m=read();tot=0;
            for(int i=1;i<=n;i++)b[i]=a[i]=read();
            sort(a+1,a+1+n);
            sz=unique(a+1,a+1+n)-(a+1);
            for(int i=1;i<=n;i++)b[i]=lower_bound(a+1,a+1+sz,b[i])-a;
            build(rt[0],1,sz);
            for(int i=1;i<=n;i++)
            insert(rt[i],1,sz,rt[i-1],b[i]);
            for(int i=1;i<=m;i++)
            {
                int s=read(),t=read(),k=read();
                int ans=query(rt[s-1],rt[t],1,sz,k);
                printf("%d
    ",a[ans]);
            }
        }
        return 0;
    }
  • 相关阅读:
    centos 编码问题 编码转换 cd到对应目录 执行 中文解压
    centos 编码问题 编码转换 cd到对应目录 执行 中文解压
    centos 编码问题 编码转换 cd到对应目录 执行 中文解压
    Android MVP 十分钟入门!
    Android MVP 十分钟入门!
    Android MVP 十分钟入门!
    Android MVP 十分钟入门!
    mysql备份及恢复
    mysql备份及恢复
    mysql备份及恢复
  • 原文地址:https://www.cnblogs.com/Zars19/p/6775196.html
Copyright © 2011-2022 走看看