zoukankan      html  css  js  c++  java
  • POJ2104 K-th Number 划分树 模板题啊

    /*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
    ",ans);
           }
        }
        return 0;
    }
    View Code

     num数组一定要初始化,但是不知为什么POJ没初始化就过了,HDU同样的题就必须初始化,反正加上初始化没有错

  • 相关阅读:
    MySQL 数据实时同步到 Elasticsearch 的技术方案选型和思考
    编写高质量可维护的代码之优化逻辑判断
    Java8 lambda表达式常见用法
    jar安装到maven本地仓库
    微信小程序获取用户手机号
    spring aop 、Redis实现拦截重复操作
    redis自定义RedisCacheManager
    locust做并发测试实战
    几个绕过短信验证码限制的漏洞挖掘
    通达OA任意用户登录和后台GetShell漏洞复现
  • 原文地址:https://www.cnblogs.com/shuguangzw/p/4937646.html
Copyright © 2011-2022 走看看