1 条题解
-
0
思路
注意到 ,暴力显然会超时。
将每次操作后的数列输出出来,发现会在一定次数的翻转后,重新回到初始数列。
,循环节一定不会太长,所以暴力处理循环节长度即可。
代码
#include<bits/stdc++.h> using namespace std; int n,lo,k,l1,l2,r1,r2,b[114]; bool fl; int main() { cin>>n>>k; cin>>l1>>r1>>l2>>r2; for(int i=1; i<=n; i++)b[i]=i;//初始化 while(!fl) { fl=true; for(int i=l1,j=r1; i<j; i++,j--)swap(b[i],b[j]); for(int i=l2,j=r2; i<j; i++,j--)swap(b[i],b[j]); for(int i=1; i<=n; i++) { if(b[i]!=i)fl=false; } lo++;//循环节长度加一 if(lo==k)break;//循环节长度超过 k 时,继续计算已经没有意义了 } k%=lo; while(k--) { for(int i=l1,j=r1; i<j; i++,j--)swap(b[i],b[j]); for(int i=l2,j=r2; i<j; i++,j--)swap(b[i],b[j]); } for(int i=1; i<=n; i++)cout<<b[i]<<endl; }
- 1
信息
- ID
- 6890
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 6
- 标签
- 递交数
- 45
- 已通过
- 15
- 上传者