80pts 求调
查看原帖
80pts 求调
646208
Hughpig楼主2024/7/19 16:59
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define up(l,r,i) for(int i=(l);i<=(r);++i)

constexpr int N=2e6+5;

ll n,m,k,a[N],s1[N],s2[N],l[N],r[N],maxodd,maxeven;
string s;

void prework(){
	up(1,n,i)s1[i]=s1[i-1]+a[i];
	for(int i=n;i;--i)s2[i]=s2[i+1]+a[i];
	l[s1[n]]=1,r[s1[n]]=n;
	ll _l=0,_r=0;
	up(1,n,i)if(a[i]==1&&_l==0){_l=i;break;}
	for(int i=n;i;--i)if(a[i]==1&&_r==0){_r=i;break;}
	if(s1[n]%2){
		maxodd=s1[n];
		if(_l?s1[n]-s1[_l]:0>_r?s2[n]-s2[_r]:0){
			maxeven=_l?s1[n]-s1[_l]:0;
			l[maxeven]=_l+1,r[maxeven]=n;
		}
		else{
			maxeven=_r?s2[n]-s2[_r]:0;
			l[maxeven]=1,r[maxeven]=_r-1;
		}
	}
	else{
		maxeven=s1[n];
		if(_l?s1[n]-s1[_l]:0>_r?s2[n]-s2[_r]:0){
			maxodd=_l?s1[n]-s1[_l]:0;
			l[maxodd]=_l+1,r[maxodd]=n;
		}
		else{
			maxodd=_r?s2[n]-s2[_r]:0;
			l[maxodd]=1,r[maxodd]=_r-1;
		}
	}
	while(maxeven>0){
		ll qwq=maxeven-2;
		if(a[l[maxeven]]==1&&a[r[maxeven]]==1)l[qwq]=l[maxeven]+1,r[qwq]=r[maxeven]-1;
		else if(a[l[maxeven]]==2)l[qwq]=l[maxeven]+1,r[qwq]=r[maxeven];
		else l[qwq]=l[maxeven],r[qwq]=r[maxeven]-1;
		maxeven-=2;
	}
	while(maxodd>0){
		ll qwq=maxodd-2;
		if(a[l[maxodd]]==1&&a[r[maxodd]]==1)l[qwq]=l[maxodd]+1,r[qwq]=r[maxodd]-1;
		else if(a[l[maxodd]]==2)l[qwq]=l[maxodd]+1,r[qwq]=r[maxodd];
		else l[qwq]=l[maxodd],r[qwq]=r[maxodd]-1;
		maxodd-=2;
	}
}

int main(){
	ios::sync_with_stdio(0);
	cin.tie(nullptr);
	cin>>n>>m>>s;
	up(1,n,i)a[i]=1+(s[i-1]=='T');
	prework();
	while(m--){
		cin>>k;
		if(l[k]==0){
			cout<<"NIE\n";
			continue;
		}
		cout<<l[k]<<' '<<r[k]<<'\n';
	}
}
2024/7/19 16:59
加载中...