我们分类讨论前一个数, a[i-1]=0时, 此时优先4,2,0, a[i-1]=4时, 优先0, 2, 4, a[i-1]=2时, 0|4均可
贪心即可处理
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <stdlib.h>
#include <vector>
#include <queue>
#include <cmath>
#include <stack>
#include <map>
using namespace std;
#define ms(x, n) memset(x,n,sizeof(x));
typedef long long LL;
const LL maxn = 1e5+10;
int n, a[maxn], curA[maxn];
queue<int> q0, q2, q4; //储存0, 2, 4的位置
int main()
{
cin >> n;
a[0] = 0;
for(int i = 1; i <= n; i++){
cin >> a[i];
if(a[i]==0) q0.push(i);
else if(a[i]==2) q2.push(i);
else if(a[i]==4) q4.push(i);
}
//重新排序
for(int i = 1; i <= n; i++){
if(curA[i-1]==0){
if(!q4.empty()){
curA[i] = a[q4.front()];
q4.pop();
}
else if(!q2.empty()){
curA[i] = a[q2.front()];
q2.pop();
}
else if(!q0.empty()){
curA[i] = a[q0.front()];
q0.pop();
}
}
else if(curA[i-1]==4){
if(!q0.empty()){
curA[i] = a[q0.front()];
q0.pop();
}
else if(!q2.empty()){
curA[i] = a[q2.front()];
q2.pop();
}
else if(!q4.empty()){
curA[i] = a[q4.front()];
q4.pop();
}
}
else if(curA[i-1]==2){
if(!q4.empty()){
curA[i] = a[q4.front()];
q4.pop();
}
else if(!q0.empty()){
curA[i] = a[q0.front()];
q0.pop();
}
else if(!q2.empty()){
curA[i] = a[q2.front()];
q2.pop();
}
}
}
LL ans = 0;
for(int i = 1; i <= n; i++){
ans += (curA[i]-curA[i-1])*(curA[i]-curA[i-1]);
}
cout << ans << endl;
return 0;
}