1 条题解

  • 0
    @ 2025-8-24 22:24:21

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar RedLycoris
    原id paulzrm | nju

    搬运于2025-08-24 22:24:21,当前版本为作者最后更新于2020-09-10 22:02:35,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    这里是官方题解


    考虑到在所有的排序操作之后,之前的所有操作都会没有用。

    所以我们只需要找到最后的一个排序操作后处理即可。

    对于翻转,我们只需要设定一个变量xx

    如果是正序,x=0x=0,反之,x=1x=1

    如果翻转了,x=1xx=1-x

    如果交换了:

    x=0x=0swap(a[l],a[r])swap(a[l],a[r])

    x=1x=1swap(a[nl+1],a[nr+1])swap(a[n-l+1],a[n-r+1])

    最后输出即可。

    Code:

    #include<iostream>
    #include<cstdio>
    using namespace std;
    bool rev;
    int ope[1000005];
    int x[1000005],y[1000005];
    int arr[1000005];
    int main(){
    	int n,m,lst;
    	scanf("%d%d",&n,&m);
    	for(int i=1;i<=n;++i)arr[i]=i;
    	for(int i=1;i<=m;++i){
    		scanf("%d",ope+i);
    		if(ope[i]==3)scanf("%d%d",x+i,y+i);
    	}
    	for(lst=m;lst;--lst)if(ope[lst]==1 or ope[lst]==2)break;
    	if(ope[lst]==2)rev=1;
    	else rev=0;
    	for(int i=lst+1;i<=m;++i){
    		if(ope[i]==3){
    			if(not rev)swap(arr[x[i]],arr[y[i]]);
    			else swap(arr[n-x[i]+1],arr[n-y[i]+1]);
    		}else rev=1-rev;
    	}
    	if(rev==0)for(int i=1;i<=n;++i)printf("%d ",arr[i]);
    	else for(int i=n;i;--i)printf("%d ",arr[i]);
    	return 0;
    }
    
    • 1

    信息

    ID
    5739
    时间
    1000ms
    内存
    128MiB
    难度
    2
    标签
    (无)
    递交数
    0
    已通过
    0
    上传者