[AGC058A] Make it Zigzag 题解
前言
赛时
解法
这道题我用了与官方题解与众不同的做法。
考察每个连续的
该操作无后效性的证明:
用我们的方法,后面的操作只会用到
由于操作次数最多为
放代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
ios::sync_with_stdio(false);
int n; cin>>n;
vector<int> a(n<<1),b;
for(auto &i:a)cin>>i;
for(int i=0;i<n<<1;i+=2){
if(i+2>=n<<1){if(a[i+1]<a[i])b.emplace_back(i+1); break;}
if(a[i+1]>max(a[i],a[i+2]))continue;
if(a[i]>a[i+2])swap(a[i],a[i+1]),b.emplace_back(i+1);
else swap(a[i+1],a[i+2]),b.emplace_back(i+2); // 判断与交换
}
cout<<b.size()<<endl;
for(int i:b)cout<<i<<' ';
cout<<endl;
return 0;
}