Subtask #0 0分求助
查看原帖
Subtask #0 0分求助
486289
Will_qwq楼主2024/2/25 12:28

过了样例和 Subtask #1,但是
开了O2 全TLE
评测记录

不开O2 全MLE
评测记录

有没有好心人帮忙 解释产生这种情况的原因 或者 提点优化建议,谢谢QWQ
代码见下

#include<iostream>
using namespace std;

const int Maxn=10005;
const int inf=0x7fffffff;
struct node{
	bool emp=true;//是否为空
	int l=0,r=0;
	int sum,siz=0;
}t[Maxn];
int len=0;

#define Emp t[k].emp
#define L t[k].l
#define R t[k].r
#define S t[k].sum
#define Si t[k].siz

void print(void){
	for(int k=1;k<=len;k++)
		cout<<S<<" "<<L<<" "<<R<<" "<<Si<<endl;
	return;
}

void New(int k,int v){
	Emp=false;
	S=v;
	Si=1;
	return;
}

//插入
void insert(int v,int k=1){
	if(Emp)//如果此位置为空
		return New(++len,v);
	Si++;
	if(v>S){//去右子树
		if(t[R].emp)
			R=len+1;
		return insert(v,R);
	}
	//去左子树
	if(t[L].emp)
		L=len+1;
	return insert(v,L);
}

//找排名
int ask_rank(int v,int k=1,int sum=0){
	if(Emp)
		return sum+1;
	if(v>S)
		return ask_rank(v,R,sum+Si-t[R].siz);
	else if(v<S)
		return ask_rank(v,L,sum);
	return sum+Si-t[R].siz;
}

//找对应值
int ask_value(int r,int k=1,int sum=0){
	if(r==sum+Si-t[R].siz)
		return S;
	else if(r>sum+Si-t[R].siz)
		return ask_value(r,R,Si-t[R].siz);
	return ask_value(r,L);
}

//找前驱
int ask_per(int v,int k=1,int ans=-inf){
	if(Emp)
		return ans;
	if(v<=S)
		return ask_per(v,L,ans);
	return ask_per(v,R,max(ans,S));
}

//找后继
int ask_back(int v,int k=1,int ans=inf){
	if(Emp)
		return ans;
	if(v>=S)
		return ask_back(v,R,ans);
	return ask_back(v,L,min(ans,S));
}

#undef Emp
#undef L
#undef R 
#undef S 
#undef Si 

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	int q;
	cin>>q;
	while(q--){
		int x,opt;
		cin>>opt>>x;
		switch(opt){
		case 1:
			cout<<ask_rank(x)<<'\n';
			break;
		case 2:
			cout<<ask_value(x)<<'\n';
			break;
		case 3:
			cout<<ask_per(x)<<'\n';
			break;
		case 4:
			cout<<ask_back(x)<<'\n';
			break;
		case 5:
			insert(x);
			break;
		}
	}
	return 0;
}

请回复之后@我

2024/2/25 12:28
加载中...