Cod sursa(job #795066)

Utilizator andunhillMacarescu Sebastian andunhill Data 7 octombrie 2012 15:50:46
Problema Balanta Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
#include<fstream>
#include<iostream>
#include<ctime>
using namespace std;

clock_t start=clock();

ifstream f("balanta.in");
ofstream g("balanta.out");

int N, M;
int sh[1030];
int sl[1030];
int A[1030], B[1030];

void diff(int n, int *shl, int *a, int *b)
{   int i;

    for(i = 1; i <= n; i++)
    {   if(shl[a[i]]) shl[0]--;
        shl[a[i]] = 0;

        if(shl[b[i]]) shl[0]--;
        shl[b[i]] = 0;
    }
}

void intersec(int n, int *shl, int *a)
{   int i;
    int aux[1030];

    for(i = 0; i <= N; i++) aux[i] = shl[i], shl[i] = 0;

    for(i = 1; i <= n; i++)
        if(aux[a[i]])
        {   shl[a[i]] = 1;
            shl[0]++;
        }
}

int unic(int *shl)
{   for(int i = 1; i <= N; i++)
        if(shl[i]) return i;
    return 0;
}

int main()
{   int i, j, k, v;
    int ans = 0;

    f>>N>>M;
    for(i = 1; i <= N; i++)
        sh[++sh[0]] = sl[++sl[0]] = 1;

    for(i = 1; i <= M; i++)
    {   f>>k;
        for(j = 1; j <= k; j++)
            f>>A[j];
        for(j = 1; j <= k; j++)
            f>>B[j];
        f>>v;

        if(v == 0)
        {   diff(k, sh, A, B);
            diff(k, sl, A, B);
        }
        if(v == 1)
        {   intersec(k, sh, A);
            intersec(k, sl, B);
        }
        if(v == 2)
        {   intersec(k, sh, B);
            intersec(k, sl, A);
        }
    }
    if(sh[0] == 1 && sl[0] == 0)
        ans = unic(sh);
    if(sh[0] == 0 && sl[0] == 1)
        ans = unic(sl);

    g<<ans;
    cout << 1.0*(clock()-start)/(1.0*CLOCKS_PER_SEC) << '\n';

    f.close();
    g.close();
    return 0;
}