Cod sursa(job #1164663)

Utilizator DanielRusuDaniel Rusu DanielRusu Data 2 aprilie 2014 11:20:07
Problema Multimi2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.45 kb
#include <fstream>
#include <algorithm>

using namespace std;

ifstream fin("multimi2.in");
ofstream fout("multimi2.out");

int v1[500001], v2[500001], i, n, x, y;

void afisare();

int main() {
    fin >> n;

    if(n == 3) {
        fout << "0\n2\n1 2\n1\n3\n";

        fin.close();
        fout.close();

        return 0;
    }

    if(n % 2 == 0 && (n / 2) % 2 == 0) {
        for(i = 1;i <= n / 2;i += 2) {
            v1[++v1[0]] = i;
            v1[++v1[0]] = n - i + 1;
            v2[++v2[0]] = i + 1;
            v2[++v2[0]] = n - i;
        }

        fout << "0\n";

        afisare();

        fin.close();
        fout.close();

        return 0;
    }

    if(n % 2 == 0 && (n / 2) % 2 == 1) {
        for(i = 1;i <= n / 2 - 1;i += 2) {
            v1[++v1[0]] = i;
            v1[++v1[0]] = n - i + 1;
            v2[++v2[0]] = i + 1;
            v2[++v2[0]] = n - i;
        }

        v1[++v1[0]] = i;
        v2[++v2[0]] = i + 1;

        fout << "1\n";

        afisare();

        fin.close();
        fout.close();

        return 0;
    }

    if(n % 2 == 1 && ((n - 3) / 2) % 2 == 0) {
        v1[++v1[0]] = 1;
        v1[++v1[0]] = 2;
        v2[++v2[0]] = 3;

        x = 4;
        y = n;

        fout << "0\n";

        while(x < y) {
            v1[++v1[0]] = x;
            v1[++v1[0]] = y;
            v2[++v2[0]] = x + 1;
            v2[++v2[0]] = y - 1;
            x += 2;
            y -= 2;
        }

        afisare();

        fin.close();
        fout.close();

        return 0;
    }

    if(n % 2 == 1 && ((n - 3) / 2)% 2 == 1) {
        v1[++v1[0]] = 1;
        v1[++v1[0]] = 2;
        v2[++v2[0]] = 3;

        x = 4;
        y = n;

        fout << "1\n";

        while(y - x > 1) {
            v1[++v1[0]] = x;
            v1[++v1[0]] = y;
            v2[++v2[0]] = x + 1;
            v2[++v2[0]] = y - 1;
            x += 2;
            y -= 2;
        }

        v1[++v1[0]] = x;
        v2[++v2[0]] = y;

        afisare();

        fin.close();
        fout.close();

        return 0;
    }
}

void afisare() {
    sort(v1 + 1, v1 + 1 + v1[0]);
    sort(v2 + 1, v2 + 1 + v2[0]);

    fout << v1[0] << '\n';

    for(i = 1;i <= v1[0];i++) {
        fout << v1[i] << ' ';
    }

    fout << '\n';

    fout << v2[0] << '\n';

    for(i = 1;i <= v2[0];i++) {
        fout << v2[i] << ' ';
    }

    fout << '\n';
}