0pts求调
查看原帖
0pts求调
1163927
F1NE楼主2024/5/27 23:56
#include<bits/stdc++.h>
#define mid(x,y) (x+y)>>1
#define getm int m=mid(s,t)
using namespace std;
const int maximum=200009;
int N,M,cnt=0,a[maximum]/*原数组*/,srt[maximum]/*排序数组*/,
	ver[maximum];
map<int,int> mp;
struct node{
	int l,r,v;
}pzt[maximum<<5];
void build(int s,int t,int p){
	if(s==t) return;
	getm;int l=cnt++;int r=cnt++;
	pzt[p].l=l,pzt[p].r=r;
	build(s,m,l),build(m+1,t,r);
	return;
}
void wt(int lo,int s,int t,int p){
	if(s==t){
		pzt[p].v++;return;
	}
	getm;int nw=cnt++;
	pzt[p].v++;
	if(lo<=m){
		pzt[nw]=pzt[pzt[p].l];
		pzt[p].l=nw;
		wt(lo,s,m,nw);
	}
	else if(lo>m){
		pzt[nw]=pzt[pzt[p].r];
		pzt[p].r=nw;
		wt(lo,m+1,t,nw);
	}
	return;
} 
int rd(int k,int s,int t,int p1,int p2){
	if(s==t) return srt[s];
	int l1=pzt[p1].l,l2=pzt[p2].l;
	int num=pzt[l2].v-pzt[l1].v;
	getm;
	if(k<num){
		return rd(k,s,m,l1,l2);
	}
	else if(k>=num){
		return rd(k-num,m+1,t,pzt[p1].r,pzt[p2].r);
	}
	return -1;
} 
int main(){
	cin>>N>>M;
	for(int i=1;i<=N;i++){//输入 
		scanf("%d",&a[i]);
		srt[i]=a[i];
	}
	sort(srt+1,srt+N+1);//排序 
	for(int i=1,j=1;i<=N;i++){//离散化映射 
		if(srt[i]!=srt[i-1]) mp[srt[i]]=j++;
	}
	unique(srt+1,srt+1+N);
//	for(int j=1;j<=N;j++) cout<<mp[srt[j]]<<' ';cout<<endl;
	ver[0]=cnt++;//初始根 
	build(1,N,0);//建树 
	
	for(int i=1;i<=N;i++){//插入 
		ver[i]=cnt++;//新建根 
		pzt[ver[i]]=pzt[ver[i-1]];//新根初始化 
		wt(mp[a[i]],1,N,ver[i]);//写 
	}
//for(int j=0;j<cnt;j++) printf("p=%d,l=%d,r=%d,v=%d\n",j,pzt[j].l,pzt[j].r,pzt[j].v);
	for(int i=1,l,r,k;i<=M;i++){
		scanf("%d%d%d",&l,&r,&k);
		printf("%d\n",rd(k,1,N,ver[l-1],ver[r]));
	}
	return 0;
} 

样例输出:

26465
26287
26465
26465
26465

很奇怪,像是错位了,但是映射没有问题

2024/5/27 23:56
加载中...