36pts球条
查看原帖
36pts球条
1049868
freeHackerJava楼主2024/10/16 22:21

rt,dfsgr和dfs函数太低效。求优化。

#include<bits/stdc++.h>
#define rep(i,l,r) for(int i=(l);i<=(r);i++)
#define per(i,l,r) for(int i=(r);i>=(l);i--)
using namespace std;
const int N=1e6+10;
struct node{
	char k;
	int da,l,r;
}t[N];
int n,m,q,cnt=1;
string s;
inline int finds(int l,int r){
	int tp=1;
	rep(i,l,r){
		if(s[i]=='?'){
			tp++;
		}else if(s[i]==':'){
			if(--tp==0){
				return i;
			}
		}
	}
	return -1;
}
inline void dfsgr(int u,int l,int r){
	int uda=0,udf=1;
	rep(i,l,r){
		if(s[i]>='0'&&s[i]<='9'){
			uda=uda*10+s[i]-'0';
		}else{
			udf=0;
			break;
		}
	}
	if(udf){
		t[u].da=uda;
		return ;
	}
	t[u].k=s[l+1];
	int tp=0;
	rep(i,l+2,r){
		if(s[i]>='0'&&s[i]<='9'){
			t[u].da=t[u].da*10+s[i]-'0';
		}else{
			tp=i+1;
			break;
		}
	}
	int pos=finds(tp,r);
	t[u].l=++cnt;
	dfsgr(cnt,tp,pos-1);
	t[u].r=++cnt;
	dfsgr(cnt,pos+1,r);
}
int dfs(int u,int x){
	if(!t[u].k){
		return t[u].da;
	}
	if(t[u].k=='>'){
		if(x>t[u].da){
			return dfs(t[u].l,x);
		}else{
			return dfs(t[u].r,x);
		}
	}else{
		if(x<t[u].da){
			return dfs(t[u].l,x);
		}else{
			return dfs(t[u].r,x);
		}
	}
}
int main(){
	//freopen("xx.in","r",stdin);
	//freopen("xx.out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>m>>q>>s;
	n=s.size();
	s=" "+s;
	dfsgr(1,1,n);
	while(q--){
		int x;
		cin>>x;
		cout<<dfs(1,x)<<"\n";
	}
	return 0;
}
2024/10/16 22:21
加载中...