Cod sursa(job #1940203)

Utilizator vladm98Munteanu Vlad vladm98 Data 26 martie 2017 14:50:32
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.87 kb
#include <bits/stdc++.h>
//#include <string.h>
using namespace std;
//ifstream cin ("date.in");
//ofstream cout ("date.out");
int v[500001];
map<int, int> sol;
int main()
{
    int n, m, cate_pare = 0, cate_impare = 0, cate_pare_int_m, cate_impare_in_m;
    cin >> n >> m;
    if (n%2)
    {
        cout <<-1;
        return 0;
    }
    cate_impare_in_m = m/2+(m%2==1);
    cate_pare_int_m = m/2;
    for (int i = 1; i<=n; ++i)
    {
        cin >> v[i];
        if (sol.count(v[i]))
        {
            v[i] = -1;
            continue;
        }
        sol[v[i]]=1;
        if (v[i]%2)
        {
            if (cate_impare == n/2)
            {
                v[i] = -1;
            }
            else
            {
                cate_impare++;
                if (v[i]<=m)
                    --cate_impare_in_m;
            }
        }
        else
        {
            if (cate_pare==n/2)
                v[i] = -1;
            else
            {
                cate_pare++;
                if (v[i]<=m)
                    --cate_pare_int_m;
            }
        }
    }
    if (cate_impare_in_m+cate_impare<n/2 || cate_pare+cate_pare_int_m<n/2)
    {
        cout << "-1";
        return 0;
    }
    cout << n-cate_impare-cate_pare << '\n';
    int par = 2, impar = 1;
    for (int i = 1; i<=n; ++i)
    {
        if (v[i] == -1)
        {
            if (cate_pare<n/2)
            {
                while (sol.count(par))
                    par+=2;
                cate_pare++;
                v[i] = par;
                par+=2;
            }
            else
            {
                while (sol.count(impar))
                    impar+=2;
                cate_impare++;
                v[i] = impar;
                impar+=2;
            }
        }
        cout << v[i] << " ";
    }
    return 0;
}