Codeforces 1265D

Description

思路

首先根据奇偶性,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 ";}
            }
        }
    }
}

------------恢复内容结束------------

原文地址:https://www.cnblogs.com/limil/p/12622950.html