Cod sursa(job #575671)

Utilizator wamfeverDobos Ionut wamfever Data 8 aprilie 2011 17:20:17
Problema Multimi2 Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.4 kb
#include<fstream>
#include<algorithm>
#define MAx 1000001
using namespace std;

int n;
//int v[MAx];
int a[MAx], b[MAx];
int La, Lb, diferenta;
ifstream fin("multimi2.in");
ofstream fout("multimi2.out");

void afis()
{
    fout << diferenta << "\n";
    sort(a+1, a+La+1);
    sort(b+1, b+Lb+1);
    fout << La << "\n";
    for(int i=1; i<=La; i++) fout << a[i] << " ";
    fout << "\n" << Lb << "\n";
    for(int i=1; i<=Lb; i++) fout << b[i] << " ";
    fout << "\n";
}

void solve_0()
{
    if(n%4 == 0)
    {
        diferenta = 0;
        int k=n/4;
        for(int i=1; i<=2*k-1; i+=2)
        a[++La] = i, a[++La] = n-i+1;
        for(int i=2; i<=2*k; i+=2)
        b[++Lb] = i, b[++Lb] = n-i+1;

    }
}

void solve_1()
{
    if(n%4 == 1)
    {
        diferenta = 1;
        int k = n/4;
        int ok_A, ok_B, caut;
        for(int i=1; i<2*k; i+=2)
        {
            a[++La] = i;
            a[++La] = n-i+1;
            if( i == k ) ok_A = 1, caut = i;
        }

        for(int i=2; i<=2*k; i+=2)
        {
            b[++Lb] = i;
            b[++Lb] = n-i+1;
            if( i == k ) ok_B = 1, caut = i;
        }

        if(k%2)
        {
            b[++Lb] = a[caut];
            a[caut] = 2*k+1;
        }
        else
        {
            a[++La] = b[caut];
            b[caut] = 2*k+1;
        }
    }
}

void solve_2()
{
    if(n%4 == 2)
    {
        diferenta = 1;
        int k = n/4;
        for(int i=1; i<2*k; i+=2)
        a[++La] = i, a[++La] = n-i+1;
        for(int i=2; i<=2*k; i+=2)
        b[++Lb] = i, b[++Lb] = n-i+1;
        a[++La] = 2*k+1;
        b[++Lb] = 2*k+2;

    }
}

void solve_3()
{
    if(n%4 == 3)
    {
        diferenta=0;
        int k=n/4;
        int /*ok_A, ok_B, */caut;
        for(int i=1; i<2*k; i+=2)
        {
            a[++La] = i;
            a[++La] = n-i+1;
            if( i == k ) caut = i;
        }

        for(int i=2; i<=2*k; i+=2)
        {
            b[++Lb] = i;
            b[++Lb] = n-i+1;
            if( i == k ) caut = i;
        }

        if(k%2)
        {
            b[++Lb] = a[caut];
            b[++Lb] = 2*k+3;
            a[caut] = 2*k+1;
            a[++La] = 2*k+2;
        }

        else
        {
            a[++La] = b[caut];
            a[++La] = 2*k+3;
            b[caut] = 2*k+1;
            b[++Lb] = 2*k+2;
        }
    }
}

int main()
{
    fin >> n;
    solve_0();
    solve_1();
    solve_2();
    solve_3();
    afis();
    return 0;
}