zoukankan      html  css  js  c++  java
  • AC日记——可怜的狗狗 洛谷 P1533

    可怜的狗狗

    思路:

      主席树第k大;

    代码:

    #include <bits/stdc++.h>
    using namespace std;
    #define maxn 300001
    #define maxn_ maxn*30
    int n,m,lc[maxn_],rc[maxn_],dis[maxn_],root[maxn];
    int tot,ai[maxn],bi[maxn],size;
    inline void in(int &now)
    {
        char Cget=getchar();now=0;
        while(Cget>'9'||Cget<'0') Cget=getchar();
        while(Cget>='0'&&Cget<='9')
        {
            now=now*10+Cget-'0';
            Cget=getchar();
        }
    }
    void build(int &now,int l,int r)
    {
        now=++tot;
        if(l==r)return;
        int mid=l+r>>1;
        build(lc[now],l,mid);
        build(rc[now],mid+1,r);
    }
    void add(int &now,int pre,int l,int r,int to)
    {
        now=++tot,dis[now]=dis[pre]+1;
        if(l==r) return;int mid=l+r>>1;
        if(to<=mid) add(lc[now],lc[pre],l,mid,to),rc[now]=rc[pre];
        else add(rc[now],rc[pre],mid+1,r,to),lc[now]=lc[pre];
    }
    int query(int now,int pre,int l,int r,int k)
    { 
        if(l==r) return l;int mid=l+r>>1;
        int di=dis[lc[now]]-dis[lc[pre]];
        if(k<=di) return query(lc[now],lc[pre],l,mid,k);
        else return query(rc[now],rc[pre],mid+1,r,k-di);
    }
    int main()
    {
        in(n),in(m);
        for(int i=1;i<=n;i++) in(ai[i]),bi[i]=ai[i];
        sort(bi+1,bi+n+1),size=unique(bi+1,bi+n+1)-bi-1;
        build(root[0],1,size);
        for(int i=1;i<=n;i++)
        {
            int to=lower_bound(bi+1,bi+size+1,ai[i])-bi;
            add(root[i],root[i-1],1,size,to);
        }
        int l,r,k;
        while(m--)
        {
            in(l),in(r),in(k);
            printf("%d
    ",bi[query(root[r],root[l-1],1,size,k)]);    
        }
        return 0;
    }
  • 相关阅读:
    博客作业03--栈和队列
    博客作业02---线性表
    博客作业01-抽象数据类型
    C语言最后一次作业--总结报告
    C语言博客作业--函数嵌套调用
    java课程设计——2048
    博客作业06--图
    博客作业05--查找
    博客作业04--树
    博客作业03--栈和队列
  • 原文地址:https://www.cnblogs.com/IUUUUUUUskyyy/p/6939805.html
Copyright © 2011-2022 走看看