3 条题解
-
0
首先,这道题直接模拟的话会超时,因为直接模拟的话时间复杂度时是是不允许的,那如何优化,操作一一定不能在优化了,那就看操作二,可以发现,操作二只有在奇数时才会对答案有变化,所以可以记录一下奇数还是偶数,如果是奇数的话,将操作一偏移一下,可以发现如果是奇数的话,操作一在执行的时候在前半部分的位置会到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
- 上传者