程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> HDU 2665 Kth number(劃分樹)

HDU 2665 Kth number(劃分樹)

編輯:C++入門知識

HDU 2665 Kth number(劃分樹)


Problem Description Give you a sequence and ask you the kth big number of a inteval.
Input The first line is the number of the test cases.
For each test case, the first line contain two integer n and m (n, m <= 100000), indicates the number of integers in the sequence and the number of the quaere.
The second line contains n integers, describe the sequence.
Each of following m lines contains three integers s, t, k.
[s, t] indicates the interval and k indicates the kth big number in interval [s, t]
Output For each test case, output m lines. Each line contains the kth big number.
Sample Input
1 
10 1 
1 4 2 3 5 6 7 8 9 0 
1 3 2 

Sample Output
2

劃分樹:Kuangbin大大的模板。

#include
#include
#include
#include
#include
typedef long long LL;
using namespace std;
const int maxn=100000+100;
int tree[30][maxn];
int s[maxn],L[20][maxn];
int t,n,m;
void build(int l,int r,int dep)
{
//    cout<<"aaaa   "<>1;
    int ss=mid-l+1;
    for(int i=l;i<=r;i++)
    {
        if(tree[dep][i]0)
        {
            tree[dep+1][lpos++]=tree[dep][i];
            ss--;
        }
        else
            tree[dep+1][rpos++]=tree[dep][i];
        L[dep][i]=L[dep][l-1]+lpos-l;
    }
    build(l,mid,dep+1);
    build(mid+1,r,dep+1);
}
int query(int LL,int RR,int l,int r,int dep,int k)
{
//    cout<<"aaaa   "<>1;
    int cnt=L[dep][r]-L[dep][l-1];
    if(cnt>=k)
    {
        int ll=LL+L[dep][l-1]-L[dep][LL-1];
        int rr=ll+cnt-1;
        return query(LL,mid,ll,rr,dep+1,k);
    }
    else
    {
        int rr=r+L[dep][RR]-L[dep][r];
        int ll=rr-(r-l-cnt);
        return query(mid+1,RR,ll,rr,dep+1,k-cnt);
    }
}
int main()
{
    int x,y,k;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&n,&m);
        memset(tree,0,sizeof(tree));
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&tree[0][i]);
            s[i]=tree[0][i];
        }
        sort(s+1,s+n+1);
        build(1,n,0);
        for(int i=1;i<=m;i++)
        {
            scanf("%d%d%d",&x,&y,&k);
            printf("%d\n",query(1,n,x,y,0,k));
        }
    }
    return 0;
}


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved