HDU - 2665 Kth 번호 (주석 트 리 템 플 릿)
질문
문제 풀이 방향: 주석 트 리 템 플 릿 문제, 주석 트 리 의 사상 을 더 이상 소개 하지 않 겠 습 니 다. 문제 가 있 으 면 코드 주석 을 볼 수 있 습 니 다.
#include
#include
#include
#include
using namespace std;
const int maxn=100010;
int n,m,q,p,sz;
int a[maxn],b[maxn];
int lc[maxn<<5],rc[maxn<<5],sum[maxn<<5],rt[maxn<<5];
// nlog(n)
void build(int &rt,int l,int r)//
{
rt=++sz;
sum[rt]=0;//
if(l==r)
return ;//
int mid=(l+r)>>1;
build(lc[rt],l,mid);
build(rc[rt],mid+1,r);
}
int update(int o,int l,int r)
{
int oo=++sz;//
lc[oo]=lc[o],rc[oo]=rc[o],sum[oo]=sum[o]+1;// +1
if(l==r)
return oo;
int mid=(l+r)>>1;
if(mid>=p)
lc[oo]=update(lc[oo],l,mid);
else
rc[oo]=update(rc[oo],mid+1,r);
return oo;//
}
int query(int u,int v,int l,int r,int k)
{
int mid=(l+r)>>1;
int x=sum[lc[v]]-sum[lc[u]];//
if(l==r)
return l;
//kth , <= , , ; , ,
if(x>=k)
return query(lc[u],lc[v],l,mid,k);
else
return query(rc[u],rc[v],mid+1,r,k-x);
}
int main()
{
int t;
scanf("%d",&t);
while(t--){
sz=0;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
b[i]=a[i];
}
sort(b+1,b+1+n);
q=unique(b+1,b+1+n)-b-1;//
build(rt[0],1,q);
for(int i=1;i<=n;i++){
p=lower_bound(b+1,b+1+q,a[i])-b;
rt[i]=update(rt[i-1],1,q);
}
while(m--){
int l,r,k;
scanf("%d%d%d",&l,&r,&k);
printf("%d
",b[query(rt[l-1],rt[r],1,q,k)]);
}
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
POJ 2104 K - th Number 문제 풀이 & 코드뭐 공부 해요?HDU 제목 이랑 똑 같 아 요?아니 야, 아니 야. 이게 다 중 데이터 가 아니 야.http://blog.csdn.net/Rainbow6174/article/details/50374737 사실 포 인...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.