arc187_a

· · 题解

A-Add and Swap

题意简述

有一个长度为 N 的序列。

现在有一个操作:

1~n-1 中选择一个位置 i,让 i+1 加上 K,然后交换两个数的位置。

问在 5\times 10^5 内能否让序列单调不减。如果可以,请输出操作序列。

Solution

我们先从小的地方来讨论一下:

//赛时代码可能写的有些冗余,请见谅
#include<bits/stdc++.h>
using namespace std;
vector<int>ans;
int n,k;
int a[100];
void ins(int i){
    ans.push_back(i);
    a[i+1]+=k;swap(a[i],a[i+1]);
}

void PRINT(){
    if(ans.size()>5e5)exit(-1);
    puts("Yes");
    printf("%d\n",ans.size());
    for(int i:ans)printf("%d ",i);
}
bool check(int i){
    if(a[i]<a[i-1]||a[i-1]<a[i-2])return false;
    return true;
}

void change(int i){
    ins(i-1),ins(i-2);
    for(int x=1;x<=(i-2)*200;++x)ins(i-1);
    for(int x=1;x<=(i-2)*150;++x)ins(i-2);
    ins(i-1);
}

void opt(int i){
    change(i);
}
int main(){
    cin>>n>>k;
    for(int i=1;i<=n;++i)cin>>a[i];
    if(n==2){
        if(a[1]>a[2]&&a[2]+k>a[1]){
            puts("No");
            return 0;
        }
        puts("Yes");
        if(a[1]<=a[2])puts("0");
        else cout<<"1\n"<<"1"<<endl;
        return 0;
    }
    for(int i=3;i<=n;++i)opt(i);
    PRINT();
    return 0;
}