Cod sursa(job #3348437)

Utilizator robertcosacCosac Robert-Mihai robertcosac Data 21 martie 2026 21:34:10
Problema Andrei Scor 75
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.79 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f("andrei.in");
ofstream g("andrei.out");
int ctc[200009];
vector <int> v[200009], vt[200009];
int lin[200009], n, cnt=0, curr=0;
bitset <200009> viz;
int neg (int & nod)
{
    if (nod>n)
        return nod-n;
    return nod+n;
}
void add (int x, int y)
{
    v[x].push_back(y);
    vt[y].push_back(x);
}
void imposibil (int x, int y)
{
    int ngx, ngy;
    if (x<=n)
        ngx=x+n;
    else ngx=x-n;
    if (y>n)
        ngy=y-n;
    else ngy=y+n;
    add (x, ngy);
    add (y, ngx);
}
void dfs (int nod)
{
    viz[nod]=1;
    for (auto y:v[nod])
        if (!viz[y])
            dfs (y);
    lin[++cnt]=nod;
}
void dfst (int nod)
{
    viz[nod]=1;
    ctc[nod]=curr;
    for (auto y:vt[nod])
        if (!viz[y])
            dfst (y);
}
signed main ()
{
    f >> n;
    int m;
    f >> m;
    while (m--)
    {
        int a, b, c;
        f >> a >> b >> c;
        if (c==0)
            imposibil (a, b);
        else if (c==1)
            imposibil (neg(a), neg(b));
        else
        {
            imposibil (a, neg(b));
            imposibil (b, neg(a));
        }
    }
    for (int i=1; i<=2*n; i++)
    {
        if (!viz[i])
            dfs (i);
    }
    for (int i=1; i<=2*n; i++)
        viz[i]=0;
    for (int i=2*n; i>=1; i--)
    {
        if (!viz[lin[i]])
            curr++, dfst (lin[i]);
    }
    for (int i=1; i<=n; i++)
        if (ctc[i]==ctc[i+n])
        {
            g << -1;
            return 0;
        }
    for (int i=1; i<=n; i++)
    {
        if (ctc[i]<ctc[i+n])
            g << 1 <<' ';
        else
            g << 0 <<' ';
    }
}
//da memory limit exceeded
//ar trebui facute in main functiile ajutatoare dar necesita prea mult efort