Cod sursa(job #1902321)

Utilizator andru47Stefanescu Andru andru47 Data 4 martie 2017 15:16:26
Problema Amlei Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.54 kb
#include <bits/stdc++.h>
using namespace std;
const int NMAX = 500 + 5;
int n,t,u,a[50 *NMAX],b[50 * NMAX],A[50 * NMAX],B[NMAX * 50];
bool ap[110 + 5];
inline void precalc(int A[] , int a[], int &lung)
{
    bool ok[NMAX * 50];
    memset(ok , false, sizeof(ok));
    for (int i = 1; i<=n * lung; i += n)
        ok[i] = true;
    for (int i = 1; i <= n*lung; i += n)
    {
        if (ok[i] == false)
            continue;
        memset(ap , false, sizeof(ap));
        for (int ii = i; ii  <= i + n - 1; ++ii)
            ap[a[ii]] = true;
        for (int j = i + n; j<=n * lung; j += n)
        {
            bool Ok = true;
            for (int jj = j; jj<= j + n - 1 && Ok == true; ++jj)
                if(ap[a[jj]] == false)
                    Ok = false;
            if (Ok == true)
                ok[j] = false;

        }

    }
    int lnou = 0;
    int i ;
    for (i = 1; i<=n*lung; ++i)
        if (ok[i] == true)
        {
            int j;
            for (j = i; j<= i + n - 1; ++j)
                A[++lnou] = a[j];
            i = j - 1;
        }
    lung = lnou / n;
}
int main()
{
    ifstream f("amlei.in");
    freopen("amlei.out","w",stdout);
    f >> n >> t >> u;
    do
    {
        for (int i = 1; i <= n * t; ++i)
        {
            f >> a[i];
            a[i] += 52;
        }
        for (int i = 1; i <= n * u; ++i)
        {
            f >> b[i];
            b[i] += 52;
        }
        for (int i = 1; i<= n * t ; i += n)
            sort(a + i, a + i + n );
        precalc(A , a , t);
        precalc(B , b , u);
        memcpy(a , A, sizeof(A));
        memcpy(b , B, sizeof(B));
        for (int i = 1; i<= n * u ; i += n)
            sort(b + i, b + i + n );
        bool fals = true;
        for (int i = 1; i<=n * t && fals == true; i += n)
        {
            memset(ap , false, sizeof(ap));
            for (int ii = i; ii<=i + n - 1; ++ii)
                ap[a[ii]] = true;
            bool OK = false;
            for (int j = 1; j <= n * u; j += n)
            {
                bool Ok = true;
                for (int jj = j; jj<= j + n - 1; ++jj)
                    if (ap[b[jj]] == false)
                        Ok = false;
                if (Ok == true)
                {
                    OK = true;
                    break;
                }
            }
            if (OK == true)
                continue;
            else
            {
                printf("NU\n");
                fals = false;
            }

        }
        if (fals == false)
        {
            f >> n >> t >> u;
            continue;
        }
        for (int i = 1; i<=n * u && fals == true; i += n)
        {
            memset(ap , false, sizeof(ap));
            for (int ii = i; ii<=i + n - 1; ++ii)
                ap[b[ii]] = true;
            bool OK = true;
            for (int j = 1; j <= n * t; j += n)
            {
                bool Ok = true;
                for (int jj = j; jj<= j + n - 1; ++jj)
                    if (ap[a[jj]] == false)
                        Ok = false;
                if (Ok == true)
                {
                    OK = true;
                    break;
                }
            }
            if (OK == true)
                continue;
            else
            {
                printf("NU\n");
                fals = false;
            }

        }
        if (fals == true)
            printf("DA\n");
        f >> n >> t >> u;
    }
    while(!f.eof());
    return 0;
}