求助!MLE!明明不大……
查看原帖
求助!MLE!明明不大……
277974
kkkscgm楼主2020/11/1 20:25

此处代码:

#include<bits/stdc++.h>
using namespace std;
struct node{
	int v,l,r,s,size;
}a[100005];
const int m=2147483647;
int q,x,n,sum;
inline int read(){
	char c;
	bool flag;
	int k;
	while(((c=getchar())<'0'||c>'9')&&c!='-');
	if(c=='-') flag=true,k=getchar()-'0';
	else flag=false,k=c-'0';
	while((c=getchar())>='0'&&c<='9') k=k*10+c-'0';
	if(flag) return -k; else return k;
}
inline void write(int k){
	if(k<0) putchar('-'),k=-k;
	if(k>=0&&k<10){
		putchar(k+'0');
		return;
	}
	write(k/10);
	putchar(k%10+'0');
}
void in(int root){
	++a[root].size;
	if(a[root].v==x)
		++a[root].s;
	else if(a[root].v>x)
		if(a[root].l==0) ++sum,a[root].l=sum,a[sum].v=x,a[sum].size=a[sum].s=1;
		else in(a[root].l);
	else if(a[root].v<x)
		if(a[root].r==0) ++sum,a[root].r=sum,a[sum].v=x,a[sum].size=a[sum].s=1;
		else in(a[root].r);
}
int get_num(int root){
	if(a[root].v==x) return a[a[root].l].size+1;
	else if(a[root].v<x) return get_num(a[root].r)+a[a[root].l].size+a[root].s;
	else if(a[root].v>x) return get_num(a[root].l);
	else return m;
}
int get_val(int root,int th){
	if(a[a[root].l].size>=th) return get_val(a[root].l,th);
	else if(a[a[root].l].size+a[root].s>=th) return a[root].v;
	else if(a[a[root].l].size+a[root].s+a[a[root].r].size>=th) return get_val(a[root].r,th-a[a[root].l].size-a[root].s);
	else return m;
}
int get_prev(int root,int ans){
	if(a[root].v>=x)
		if(a[root].l==0) return ans;
		else return get_prev(a[root].l,ans);
	else if(a[root].r==0) return a[root].v<x?a[root].v:ans;
	else if(a[root].s==0) return get_prev(a[root].r,ans);
	else return get_prev(a[root].r,a[root].v);
}
int get_next(int root,int ans){
	if(a[root].v<=x)
		if(a[root].r==0) return ans;
		else return get_next(a[root].r,ans);
	else if(a[root].l==0) return a[root].v>x?a[root].v:ans;
	else if(a[root].s==0) return get_next(a[root].l,ans);
	else return get_next(a[root].l,a[root].v);
}
int main(){
	q=read();
	while(q--){
		n=read(),x=read();
		if(n==5) if(sum==0) sum=1,a[1].size=a[1].s=1,a[1].v=x; else in(1);
		else if(n==1) write(get_num(1)),putchar('\n');
		else if(n==2) write(get_val(1,x)),putchar('\n');
		else if(n==3) write(get_prev(1,-m)),putchar('\n');
		else if(n==4) write(get_next(1,m)),putchar('\n');
	}
	return 0;
}
2020/11/1 20:25
加载中...