社区讨论

80pts WA#2#4求调

P14972『GTOI - 2C』Fliping参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mklv4gfc
此快照首次捕获于
2026/01/20 08:35
4 周前
此快照最后确认于
2026/01/23 20:15
4 周前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n;
int a[2026];
int u[2026];
int x[10010],y[10010];
int l,r;
int step;
int f=1;
signed main(){
    scanf("%lld",&n);
    for(int i=1;i<=n;i++){
        scanf("%lld",&a[i]);
        u[a[i]]=i;
    }
    for(int i=1;i<=n;i++){
        if(a[i]!=i){
            f=0;
            break;
        }
    }
    if(f){
        printf("0");
        return 0;
    }
    for(int i=1;i<=n;i++){
        if(!(a[i]==i)){
            l=i,r=u[i];
            if(r-l+1>2){
                step++;
                x[step]=l,y[step]=r;
                while(l<r){
                    swap(a[l],a[r]);
                    swap(u[a[l]],u[a[r]]);
                    ++l,--r;
                }
            }else{
                if(i-3<1&&i+3>n){
                    printf("-1");
                    return 0;
                }
                l=1,r=i;
                step++;
                x[step]=l,y[step]=r;
                while(l<r){
                    swap(a[l],a[r]);
                    swap(u[a[l]],u[a[r]]);
                    ++l,--r;
                }
                
                l=2,r=i;
                step++;
                x[step]=l,y[step]=r;
                while(l<r){
                    swap(a[l],a[r]);
                    swap(u[a[l]],u[a[r]]);
                    ++l,--r;
                }

                l=1,r=i+1;
                step++;
                x[step]=l,y[step]=r;
                while(l<r){
                    swap(a[l],a[r]);
                    swap(u[a[l]],u[a[r]]);
                    ++l,--r;
                }

                l=1,r=i;
                step++;
                x[step]=l,y[step]=r;
                while(l<r){
                    swap(a[l],a[r]);
                    swap(u[a[l]],u[a[r]]);
                    ++l,--r;
                }
            }
        }
        f=1;
        for(int j=i+1;j<=n;j++){
            if(a[j]!=j){
                f=0;
                break;
            }
        }
        if(f){
            break;
        }
    }
    if(step>3000){
        printf("-1");
        return 0;
    }
    printf("%lld\n",step);
    for(int i=1;i<=step;i++){
        printf("%lld %lld\n",x[i],y[i]);
    }
    return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...