EF题解
对于这个问题,我们选择维护的东西是这个数列首项的位置和数列是否被翻转
具体请见代码
简单版问题在printf部分全部改为输出a[loc]即可,本场比赛的简单版的目的都是引导大家思考
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int a[100005];
void solve(){
int n,q;
int now=1,loc=1;//loc代表首项在原序列中的位置,now代表序列目前是否已被翻转
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=q;i++){
int c,x;
scanf("%d%d",&c,&x);
if((c==1&&now==1)||(c==2&&now==0))loc=loc%n+1;//未翻转1操作或翻转后2操作使得loc++
if((c==1&&now==0)||(c==2&&now==1))loc=(loc+n-2)%n+1;//翻转后1操作或未翻转1操作使得loc--
if(c==3){
if(now)loc=(loc-2+n)%n+1;
else loc=loc%n+1;
now=1-now;
}//翻转操作:将now标记更新,并把loc与当前序列尾项的位置进行交换
if(now)printf("%d\n",a[(loc+x-2+n)%n+1]);
else printf("%d\n",a[(loc+n-x)%n+1]);
}
}
int main(){
solve();
return 0;
}