P11186 56tpsRE求助,马蜂良好有注释
  • 板块灌水区
  • 楼主Flying_hp
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/10/14 18:41
  • 上次更新2024/10/14 18:42:35
查看原帖
P11186 56tpsRE求助,马蜂良好有注释
1123665
Flying_hp楼主2024/10/14 18:41

QwQ

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll m,n,q;
string s;
ll nxt[1000010];//记录每一个?后对应的: 
ll sum;
ll xp; 
ll ans;
stack<ll>p;//用于存储: 
void cal(ll l,ll r){//递归寻找答案 
	if(l>n||r>n)return;//特判 
	if(l>r)return;//特判 
	if(l==r){//没必要的特判 
		cout<<s[l]-'0'<<endl;
		return;
	}
	if(s[l]=='x'){
		ll cnt=0,id;
		for(ll i=l+2;i<=r;i++){
			if(s[i]=='?'){
				id=i;//记录?位置 
				break;
			}
			cnt=cnt*10+s[i]-'0';//记录x>a的a 
		}
		if(s[l+1]=='>'){//>的情况 
			if(xp>cnt){
				cal(id+1,nxt[id]-1);//符合去左边 
			}
			else{
				cal(nxt[id]+1,r);//不符合去右边 
			}
		}
		if(s[l+1]=='<'){//<的情况,同上 
			if(xp<cnt){
				cal(id+1,nxt[id]-1);
			}
			else{
				cal(nxt[id]+1,r);
			}
		}
	}
	else{//这就是答案了 
		ll cnt=0;
		for(ll i=l;i<=r;i++){
			cnt=cnt*10+s[i]-'0';
		}
		cout<<cnt<<endl;
		return;
	}
}
signed main(){
//	freopen("expr3.in","r",stdin);
	cin>>m>>q;
	cin>>s;
	n=s.size();
	s=" "+s;
	for(ll i=n;i>=1;i--){
		if(s[i]==':')p.push(i);//记录: 
		if(s[i]=='?'){//遇到?时,取栈顶并记录 
			nxt[i]=p.top();
			p.pop();
		}
	}
	while(q--){
		cin>>xp;
		cal(1,n);//计算 
	}
	return 0;
}

record:https://www.luogu.com.cn/record/182096167

2024/10/14 18:41
加载中...