返回题解分享
讨论 / 题解分享/ 帖子详情

神秘石板 - 题解

首先,这道题直接模拟的话会超时,因为直接模拟的话时间复杂度时是$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;
}
0 回复 0 转发 0 喜欢 0 阅读
回复 (0)
默认 最新
暂无回复,快来抢沙发!