3 条题解

  • 0
    @ 2025-3-29 2:00:47

    首先,这道题直接模拟的话会超时,因为直接模拟的话时间复杂度时是O(QN)O(Q*N)是不允许的,那如何优化,操作一一定不能在优化了,那就看操作二,可以发现,操作二只有在奇数时才会对答案有变化,所以可以记录一下奇数还是偶数,如果是奇数的话,将操作一偏移一下,可以发现如果是奇数的话,操作一在执行的时候在前半部分的位置会到x+n,后半部分会到x-n,在执行操作一如果是偶数的话可以先进行偏移,在进行交换即可

    #include<cstdio>
    #include<iostream>
    #include<vector>
    #include<map>
    #include<cstring>
    #include<array>
    #include<queue>
    #include<algorithm>
    #include<set>
    #include<cmath>
    using namespace std;
    using i64=long long;
    //using i128=__int128;
    const i64 INF=1e18;
    const int mod=998244353;
    //const int N=1e9+7;
    void solve(){
        int n;
        cin>>n;
        string s;
        cin>>s;
        int q;
        cin>>q;
        bool flag=false;
        while(q--){
            int t,a,b;
            cin>>t>>a>>b;
            a--,b--;
            if(t==1){
                if(flag){
                    a=(a<n ? a+n : a-n);
                    b=(b<n ? b+n : b-n);
                }
                swap(s[a],s[b]);
            }
            else{
                flag=!flag;
            }
        }
        if(flag){
            s=s.substr(n)+s.substr(0,n);
        }
        cout<<s<<'\n';
    }
    int main(){
        int _=1;
        //cin>>_;
        while(_--)solve();
        return 0;
    }
    

    信息

    ID
    295
    时间
    1000ms
    内存
    256MiB
    难度
    6
    标签
    递交数
    68
    已通过
    21
    上传者