思路
首先根据奇偶性,0和2所在位置的奇偶性相同,1和3所在位置奇偶性相同。故0和2的个数与1和3的个数相同或相差1。如果不满足就NO。
由于3的左右两边必须是2;1的左右两边可以是0或2。所以先放3,计算所需的最少2的个数,如果2个数不够,就NO,否则把2放满3的左右两边后,剩下就按照奇偶性随便放就好了。
#include <bits/stdc++.h>
using namespace std;
const int N = 5e5 + 10;
int arr[N];
int main() {
ios::sync_with_stdio(false);
int a, b ,c, d;
cin >> a >> b >> c >> d;
int tot = a + b + c + d;
if(tot % 2 == 0) {
if(a + c != b + d || c < d) {cout << "NO" << endl; return 0;}
cout << "YES" << endl;
for(int i = 1; i <= tot; i++) {
if(i % 2) {
if(a != 0) {cout << "0 "; a--;}
else {cout << "2 ";}
} else {
if(b != 0) {cout << "1 "; b--;}
else {cout << "3 "; }
}
}
} else {
if(abs(a + c - b - d) != 1) {cout << "NO" << endl; return 0;}
if(a + c > b + d && c < d + 1 && d != 0/*d!=0很重要,否则1 0 0 0过不了*/) {cout << "NO" << endl; return 0;}
if(a + c < b + d)
if((b == 0 && c < d - 1) || (b != 0 && c < d)) {cout << "NO" << endl; return 0;}
cout << "YES" << endl;
int p = a + c > b + d ? 0 : 1;
for(int i = 1; i <= tot; i++) {
if(i % 2 == p) {
if(b != 0) {cout << "1 "; b--;}
else {cout << "3 "; }
} else {
if(a != 0) {cout << "0 "; a--;}
else {cout << "2 ";}
}
}
}
}
------------恢复内容结束------------