Cod sursa(job #26229)

Utilizator astronomyAirinei Adrian astronomy Data 5 martie 2007 12:55:37
Problema Balanta Scor 10
Compilator c Status done
Runda Arhiva de probleme Marime 2.96 kb
#include <stdio.h>
#include <string.h>

#define MAXN 1024

int N, M, A[MAXN][MAXN], rez[MAXN], Nr[MAXN];
int nr1, nr2, mon1, mon2;

int can[MAXN];

void solve(void)
{
    int i, j, k, c;

    for(i = 0; i < N; i++)
        can[i] = 1;

    // presupun ca e mai usoara
    
    for(i = 0; i < M; i++)
    {
        k = Nr[i];
        if(rez[i] == 0)
            for(j = 0; j < (k<<1); j++)
                can[A[i][j]] = 0;
        if(rez[i] == 1)
            for(j = 0; j < k; j++)
                can[A[i][j]] = 0;
        if(rez[i] == 2)
            for(j = k; j < (k<<1); j++)
                can[A[i][j]] = 0;

    }

    // verific
    for(i = 0; i < M; i++)
    {
        k = Nr[i];
        if(rez[i] == 1)
        {
            for(c = 0, j = k; j < (k<<1); j++)
                c += can[A[i][j]];
            if(c == 0)
                memset(can, 0, sizeof(can));
        }
        if(rez[i] == 2)
        {
            for(c = j = 0; j < k; j++)
                c += can[A[i][j]];
            if(c == 0)
                memset(can, 0, sizeof(can));
        }
    }
    for(i = 0; i < N; i++)
        nr1 += can[i], mon1 = (can[i] == 1 ? i : mon1);

    // presupun ca e mai grea

    for(i = 0; i < N; i++)
        can[i] = 1;

    for(i = 0; i < M; i++)
    {
        k = Nr[i];
        if(rez[i] == 0)
            for(j = 0; j < (k<<1); j++)
                can[A[i][j]] = 0;
        if(rez[i] == 1)
            for(j = k; j < (k<<1); j++)
                can[A[i][j]] = 0;
        if(rez[i] == 2)
            for(j = 0; j < k; j++)
                can[A[i][j]] = 0;
    }

    // verific
    for(i = 0; i < M; i++)
    {
        k = Nr[i];
        if(rez[i] == 1)
        {
            for(c = j = 0; j < k; j++)
                c += can[A[i][j]];
            if(c == 0)
                memset(can, 0, sizeof(can));
        }
        if(rez[i] == 2)
        {
            for(c = 0, j = k; j < (k<<1); j++)
                c += can[A[i][j]];
            if(c == 0)
                memset(can, 0, sizeof(can));
        }
    }
    for(i = 0; i < N; i++)
        nr2 += can[i], mon2 = (can[i] == 1 ? i : mon2);
}

void read_data(void)
{
    int i, j, k;

    scanf("%d %d\n", &N, &M);

    for(i = 0; i < M; i++)
    {
        scanf("%d ", &Nr[i]), k = Nr[i];
        for(j = 0; j < (k<<1); j++)
            scanf("%d ", &A[i][j]), A[i][j]--;
        scanf("%d\n", &rez[i]);
    }
}

void write_data(void)
{
 /*   if(nr1 == nr2 && nr1 == 1 && mon1 == mon2)
    {
        printf("%d\n", mon1+1);
        return ;
    }
    if(nr2 == 1)
    {
        printf("%d\n", mon2+1);
        return ;
    }
    if(nr1 == 1)
    {
        printf("%d\n", mon1+1);
        return ;
    }*/
    printf("0\n");
}

int main(void)
{
    freopen("balanta.in", "rt", stdin);
    freopen("balanta.out", "wt", stdout);

    read_data();
    solve();
    write_data();

    return 0;
}