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;
}