[지속 가능 한 라인 트 리] poj 2104 정적 구간 k 대
6198 단어 해제
#include
#include
#include
using namespace std;
int ls[5000000];
int rs[5000000];
int sum[5000000];
int san[5000000];
int num[5000000];
int T[5000000];
int n,m,tot = 0,rt;
void build(int l,int r,int &x)
{
x = ++ tot;
sum[x] = 0;
if(l == r)
return ;
int mid = (l+r)/2;
build(l,mid,ls[x]);
build(mid+1,r,rs[x]);
}
void update(int last,int p,int l,int r,int &x)
{
x = ++ tot;
ls[x] = ls[last];
rs[x] = rs[last];
sum[x] = sum[last] + 1;
if(l == r)
return ;
int mid = (l+r)/2;
if(p <= mid)
update(ls[last],p,l,mid,ls[x]);
else
update(rs[last],p,mid+1,r,rs[x]);
}
int query(int s,int t,int l,int r,int k)
{
if(l == r)
return l;
int mid = (l+r)/2;
int cnt = sum[ls[t]] - sum[ls[s]];
if(k <= cnt)
return query(ls[s],ls[t],l,mid,k);
else
return query(rs[s],rs[t],mid+1,r,k-cnt);
}
int main()
{
int x,y,z;
scanf("%d%d",&n,&m);
for(int i = 1;i <= n;i ++)
{
scanf("%d",&num[i]);
san[i] = num[i];
}
tot = 0;
sort(san+1,san+n+1);
int cnt = unique(san+1,san+n+1)-san-1;
build(1,cnt,T[0]);
for(int i = 1;i <= n;i ++)
num[i] = lower_bound(san+1,san+cnt+1,num[i]) - san;
for(int i = 1;i <= n;i ++)
update(T[i-1],num[i],1,cnt,T[i]);
for(int i = 1;i <= m;i ++)
{
scanf("%d%d%d",&x,&y,&z);
int id = query(T[x-1],T[y],1,cnt,z);
printf("%d
",san[id]);
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
LeetCode - 503. 다음 더 큰 요소 II (Next Greater Element II) [중간] - 분석 및 코드 (Java)순환 배열 (마지막 요소 의 다음 요 소 는 배열 의 첫 번 째 요소) 을 지정 하고 모든 요소 의 다음 요 소 를 출력 합 니 다.숫자 x 의 다음 더 큰 요 소 는 배열 에 따라 순 서 를 옮 겨 다 니 는 것 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.