码迷,mamicode.com
首页 > 其他好文 > 详细

POJ2104 K-th Number 划分树 模板题啊

时间:2015-11-04 22:56:49      阅读:281      评论:0      收藏:0      [点我收藏+]

标签:

技术分享
/*Source Code
Problem: 2104        User: 96655
Memory: 14808K        Time: 1282MS
Language: G++        Result: Accepted
Source Code*/

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<vector>
#include<stack>
using namespace std;
const int maxn=100005;
struct node
{
    int val[maxn],num[maxn];
};
struct Tree
{
    int n,o[maxn];
    node t[20];
    void init(int len)
    {
        n=len;
        for(int i=1; i<=n; i++)
        {
            scanf("%d",&o[i]);
            t[0].val[i]=o[i];
        }
        sort(o+1,o+n+1);
        build(1,n,0);
    }
    void build(int l,int r,int dep)
    {
        if(l==r)return;
        int m=(l+r)>>1;
        int lsame=m-l+1,same=0,ln=l,rn=m+1;
        for(int i=l; i<=r; i++)
            if(t[dep].val[i]<o[m])--lsame;
        for(int i=l; i<=r; i++)
        {
            if(i==l)t[dep].num[i]=0;
            else t[dep].num[i]+=t[dep].num[i-1];
            if(t[dep].val[i]<o[m])
                ++t[dep].num[i],t[dep+1].val[ln++]=t[dep].val[i];
            else if(t[dep].val[i]>o[m])
                t[dep+1].val[rn++]=t[dep].val[i];
            else
            {
                ++same;
                {
                    if(lsame>=same)
                        ++t[dep].num[i],t[dep+1].val[ln++]=t[dep].val[i];
                    else t[dep+1].val[rn++]=t[dep].val[i];
                }
            }
        }
        build(l,m,dep+1);
        build(m+1,r,dep+1);
    }
    int query(int st,int ed,int k,int l,int r,int dep)
    {
        if(l==r)return t[dep].val[l];
        int lx,ly,rx,ry,m=(l+r)>>1;
        if(st==l)lx=0;
        else lx=t[dep].num[st-1];
        ly=t[dep].num[ed];
        if(ly-lx>=k)
            return query(l+lx,l+ly-1,k,l,m,dep+1);
        else
        {
            rx=st-l-lx;
            ry=ed-st+1-(ly-lx);
            return query(m+1+rx,m+rx+ry,k-(ly-lx),m+1,r,dep+1);
        }
    }
}tree;
int main()
{
    int n,q;
    while(~scanf("%d%d",&n,&q))
    {
       tree.init(n);
       while(q--)
       {
           int l,r,k;
           scanf("%d%d%d",&l,&r,&k);
           int ans=tree.query(l,r,k,1,n,0);
           printf("%d\n",ans);
       }
    }
    return 0;
}
View Code

 

POJ2104 K-th Number 划分树 模板题啊

标签:

原文地址:http://www.cnblogs.com/shuguangzw/p/4937646.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!