Cod sursa(job #575719)

Utilizator wamfeverDobos Ionut wamfever Data 8 aprilie 2011 17:58:52
Problema Multimi2 Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.64 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");
int S1, S2;
void Sum()
{
    for(int i=1; i<=La; i++) S1 += a[i];
    S2 = n*(n+1)/2 - S1;
}

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 precomputare()
{
    //if(n==2) diferenta = 1, La = 1, Lb = 1, a[1] = 1, b[1] = 1;
    /*else*/ if (n==3) diferenta = 0, La = 2, Lb = 1, a[1] = 1, a[2] = 2, b[1] = 3;
}

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;

        for(int i=1; i<2*k; i+=2)
        {
            if(i!=k) a[++La] = i;
            a[++La] = n-i+1;
        }

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

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

        else
        {
            a[++La] = k;
            b[++Lb] = 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)
        {
            if(i!=k) a[++La] = i;
            a[++La] = n-i+1;
        }

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

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

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

    }
}

void solve(int p)
{
    //if (p==0) solve_0();
    //if (p==1) solve_1();
    //if (p==2) solve_2();
    if (p==3) solve_3();
}

int main()
{
    fin >> n;
    solve(n%4);
    precomputare();
    afis();
    return 0;
}