hdu2665
Posted 宣毅鸣
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu2665相关的知识,希望对你有一定的参考价值。
题解:
裸的主席树
但是不知道为什么mle
求大佬指教
代码:
#include<cstdio> #include<cmath> #include<algorithm> #include<cstring> using namespace std; const int N=100005; int a[N],cnt,Case,rt[N],b[N],now,n,m,x,y,k; struct Tree { int ls,rs,l,r,num; }T[N*80]; int ef(int x) { int l=1,r=cnt; while (l<r) { int mid=(l+r)/2; if (b[mid]<x)l=mid+1; else r=mid; } return l; } int build(int l,int r) { now++; if (l==r) { T[now].l=l; T[now].r=r; return now; } int k=now,mid=(l+r)/2; T[k].l=l;T[k].r=r; if (l<=mid)T[k].ls=build(l,mid); if (mid<r)T[k].rs=build(mid+1,r); return k; } int insert(int x,int l,int r,int s) { now++; if (l==r) { T[now].l=l; T[now].r=r; T[now].num=T[x].num+1; return now; } int k=now,mid=(l+r)/2; T[k].l=l;T[k].r=r; if (s<=mid) { T[k].ls=insert(T[x].ls,l,mid,s); T[k].rs=T[x].rs; } else { T[k].ls=T[x].ls; T[k].rs=insert(T[x].rs,mid+1,r,s); } T[k].num=T[T[k].ls].num+T[T[k].rs].num; return k; } int find(int x,int y,int z) { if (T[x].l==T[x].r)return T[x].l; if (T[T[x].ls].num-T[T[y].ls].num>=z)return find(T[x].ls,T[y].ls,z); return find(T[x].rs,T[y].rs,z-T[T[x].ls].num+T[T[y].ls].num); } int main() { scanf("%d",&Case); while (Case--) { memset(T,0,sizeof T); now=0; scanf("%d%d",&n,&m); for (int i=1;i<=n;i++)scanf("%d",&a[i]); for (int i=1;i<=n;i++)b[i]=a[i]; sort(b+1,b+n+1); cnt=1; for (int i=2;i<=n;i++) if (b[i]!=b[i-1])b[++cnt]=b[i]; for (int i=1;i<=n;i++)a[i]=ef(a[i]); rt[0]=build(1,n); for (int i=1;i<=n;i++)rt[i]=insert(rt[i-1],1,n,a[i]); while (m--) { scanf("%d%d%d",&x,&y,&k); printf("%d\n",b[find(rt[y],rt[x-1],k)]); } } }
以上是关于hdu2665的主要内容,如果未能解决你的问题,请参考以下文章