24ptsRE求调
查看原帖
24ptsRE求调
718667
zhaomumu1218楼主2024/10/13 13:19
#include<bits/stdc++.h>
using namespace std;
int m,q,n,cnt,sti[8000010][23];
string s;
struct node{
	int l,r,z;
	bool operator<(const node t)const{
		return l<t.l;
	}
}x[1000010];
void dfs(int l,int r,int ll,int rr){
	if(ll>rr) return ;
	int i=l;
	for(i=l;i<=r;i++) if(s[i]=='<'||s[i]=='>') break;
	int u=1;
	if(s[i]!='>'&&s[i]!='<'){
		int z=0;
		for(int j=l;j<=r;j++) z=z*10+s[j]-'0';
		x[++cnt]=(node){ll,rr,z};
		return ;
	}
	bool f=0;
	if(s[i]=='>') f=1;
	int z=0;
	i++;
	for(;s[i]>='0'&&s[i]<='9';i++) z=z*10+s[i]-'0';
	int q=++i;
	int lll=i,rrr=r,ans=r;
	while(lll<=rrr){
		int mid=(lll+rrr)/2,cd=mid-i;
		int lg=log2(cd);
		int minn=min(sti[i][lg],sti[mid-(1<<lg)+1][lg]);
		if(minn<=sti[i][0]-1) rrr=mid-1,ans=mid;
		else lll=mid+1;
	}
	i=ans;
	if(f){
		dfs(q,i-1,max(ll,z+1),rr);
		dfs(i+1,r,ll,min(rr,z));
		return ;
	}
	dfs(q,i-1,ll,min(rr,z-1));
	dfs(i+1,r,max(ll,z),rr);
}
signed main(){
	scanf("%d%d",&m,&q);
	cin>>s;
	n=s.size();
	s=" "+s;
	for(int i=1;i<=n;i++){
		sti[i][0]=sti[i-1][0];
		if(s[i]==':') sti[i][0]--;
		if(s[i]=='?') sti[i][0]++;
	}
	for(int i=1;i<=22;i++) for(int j=1;j<=n;j++) sti[j][i]=min(sti[j][i-1],sti[j+(1<<i-1)][i-1]);
	dfs(1,n,0,1000000000);
	sort(x+1,x+1+cnt);
	for(int i=1;i<=q;i++){
		int z;
		scanf("%d",&z);
		int l=1,r=cnt,ans=cnt;
		while(l<=r){
			int mid=(l+r)/2;
			if(z>=x[mid].l) l=mid+1,ans=mid;
			else r=mid-1;
		}
		printf("%d\n",x[ans].z);
	}
	return 0;
}
2024/10/13 13:19
加载中...