社区讨论

56pts MLE 玄关求调

P11186三目运算参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@m2mz0xwl
此快照首次捕获于
2024/10/24 15:17
去年
此快照最后确认于
2024/10/24 16:10
去年
查看原帖
rt
CPP
#include <bits/stdc++.h>
using namespace std;
int m,q;
struct re{
	int val;
	int id;
}x[100010];
int ans[100010];
int a[100100];
string s;
bool cmp(re a,re b){
	return a.val<b.val;
}
inline int get(string s,int p){
	int x=0;
	for(int i=p;;i++){
		x=x*10+s[i]-'0';
		if(!isdigit(s[i+1])) break;
	} 
	return x;
}
inline void slove(string s,int l,int r){
	if(l>r) return ;
	if(isdigit(s[0])){
		int res=get(s,0);
		for(int i=l;i<=r;i++) ans[x[i].id]=res;
		return ;
	}
	string s1="";
	string s2="";
	int cntw=0,cntm=0;
	int p1=s.find('?')+1,p2=0;
	for(int i=2;i<s.size();i++){
		if(isdigit(s[i])) continue;
		if(s[i]=='?') cntw++;
		if(s[i]==':') cntm++;
		if(cntm==cntw){
			p2=i;
			break;
		}
	}
	for(int i=p1;i<p2;i++) s1+=s[i];
	for(int i=p2+1;i<s.size();i++) s2+=s[i];
	int y=get(s,2);
	if(s[1]=='<'){
		int p=lower_bound(a+l,a+r+1,y)-a;
		if(l<=p-1) slove(s1,l,p-1);
		if(p<=r) slove(s2,p,r);
	}else if(s[1]=='>'){
		int p=upper_bound(a+l,a+r+1,y)-a;
		if(p<=r) slove(s1,p,r);
		if(l<=p-1) slove(s2,l,p-1); 
	}
}
signed main(){
	cin>>m>>q;
	cin>>s;
	for(int i=1;i<=q;i++){
		cin>>x[i].val; 
		x[i].id=i;
	}
	sort(x+1,x+1+q,cmp);
	for(int i=1;i<=q;i++){
		a[i]=x[i].val;
	}
	slove(s,1,q);
	for(int i=1;i<=q;i++){
		cout<<ans[i]<<"\n";
	}
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...