luogu P1533 可怜的狗狗

Posted Nico&11101001

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了luogu P1533 可怜的狗狗相关的知识,希望对你有一定的参考价值。

题目链接

luogu P1533 可怜的狗狗

题解

主席树.

代码

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 300001;
int ls[N*20],rs[N*20],sum[N*20];
int n,m,a[N],hash[N],cnt,root[N];
int x,y,k;
void lsh()
{
    sort(hash+1,hash+n+1);
    cnt=unique(hash+1,hash+n+1)-(hash+1);
    for(int i=1;i<=n;i++)a[i]=lower_bound(hash+1,hash+cnt+1,a[i])-hash;
}
int tot=0;
void build(int l,int r,int &rt,int pre,int w)
{
    rt=++tot;
    sum[rt]=sum[pre]+1;
    if(l==r)return;
    int mid=(l+r)>>1;
    if(w<=mid)rs[rt]=rs[pre],build(l,mid,ls[rt],ls[pre],w);
    else ls[rt]=ls[pre],build(mid+1,r,rs[rt],rs[pre],w);
}
int query(int l,int r,int x,int y,int k)
{
    if(l==r)return l;
    int mid=l+r>>1,tmp=sum[ls[y]]-sum[ls[x]];
    if(tmp>=k)return query(l,mid,ls[x],ls[y],k);
    else return query(mid+1,r,rs[x],rs[y],k-tmp);
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)scanf("%d",a+i),hash[i]=a[i];
    lsh();
//    printf("%d\n",cnt);for(int i=1;i<=cnt;i++) printf("%d ",hash[i]);
    for(int i=1;i<=n;i++) build(1,cnt,root[i],root[i-1],a[i]);
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%d",&x,&y,&k);
        printf("%d\n",hash[query(1,cnt,root[x-1],root[y],k)]);
    }
    return 0;
}

以上是关于luogu P1533 可怜的狗狗的主要内容,如果未能解决你的问题,请参考以下文章

AC日记——可怜的狗狗 洛谷 P1533

[洛谷1533] 可怜的狗狗

luoguP1533可怜的狗狗

挖矿教程:突然火爆的狗狗币原来在Win10上这么好挖!

首个亚洲犬展 | 狗狗,Go! Go! Go!

大部分狗狗的体形都是非常大的,你知道巴西非勒犬有多猛吗?