1 条题解

  • 0
    @ 2026-5-19 0:16:17

    题目传送门/更好的阅读体验

    思路

    注意到 1K1091\le K\le 10^9,暴力显然会超时。

    将每次操作后的数列输出出来,发现会在一定次数的翻转后,重新回到初始数列。

    1N1001\le N\le 100,循环节一定不会太长,所以暴力处理循环节长度即可。

    代码

    #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
    上传者