我做错了什么?这不科学!
查看原帖
我做错了什么?这不科学!
841638
Igunareo楼主2024/5/12 20:37

此代码莫名其妙的有6个点输入数据不足(第二行没读满 nn 个数),哪位佬能解释一下

#include<bits/stdc++.h>
using namespace std;
int x[200005];
int z[200005],z2[200005];
int root[200005];
pair<int,int>x2[200005];
int cnt=0,top=0;
struct edge{
	int l,r,val;
}y[4000005];
bool check=0;
void up(int &now,int had,int l,int r,int p){
	if(!now)now=++top;
	if(l==r&&l==p){
		y[now].val=y[had].val+1;
		return;
	}
	int mid=(l+r)/2;
	if(p<=mid){
		y[now].r=y[had].r;
		up(y[now].l,y[had].l,l,mid,p);
	}
	else{
		y[now].l=y[had].l;
		up(y[now].r,y[had].r,mid+1,r,p);
	}
	y[now].val=y[had].val+1;
	return;
}
int down(int a,int b,int l,int r,int k){
	if(l==r)return l;
	int mid=(l+r)/2;
	if(k<=y[y[a].l].val-y[y[b].l].val)return down(y[a].l,y[b].l,l,mid,k);
	else return down(y[a].r,y[b].r,mid+1,r,k-(y[y[a].l].val-y[y[b].l].val));
}
int main(){
	int n,m;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%d",&x[i]);
		x2[i].first=x[i];
		x2[i].second=i;
	}
	sort(x2+1,x2+n+1);
	for(int i=1;i<=n;i++){
		if(x2[i].first!=x2[i-1].first)z2[++cnt]=x2[i].first;
		z[x2[i].second]=cnt;
	}
	for(int i=1;i<=n;i++)up(root[i],root[i-1],1,cnt,z[i]);
	while(m--){
		int l,r,k;
		scanf("%d%d%d",&l,&r,&k);
		printf("%d\n",z2[down(root[r],root[l-1],1,cnt,k)]);
	}
	return 0;
} 
2024/5/12 20:37
加载中...