Cod sursa(job #3345521)

Utilizator robertcosacCosac Robert-Mihai robertcosac Data 9 martie 2026 21:37:44
Problema Party Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f("party.in");
ofstream g("party.out");
vector <int> v[200009], vt[200009];
int n;
int ctc[200009];
int cnt=0, lin[200009], curr=0;
bool viz[200009];
int get_nod (int x)
{
    if (x<0)
        return -x+n;
    return x;
}
int neg (int x)
{
    if (x>n)
        return x-n;
    return x+n;
}
void add (int x, int y)
{
    v[x].push_back(y);
    vt[y].push_back(x);
}
void imposibil (int x, int y)
{
    add (x, neg(y));
    add (y, neg(x));
}
void dfs0 (int nod)
{
    viz[nod]=1;
    for (auto y:v[nod])
        if (!viz[y])
            dfs0 (y);
    lin[++cnt]=nod;
}
void dfs (int nod)
{
    viz[nod]=1;
    ctc[nod]=curr;
    for (auto y:vt[nod])
        if (!viz[y])
            dfs (y);
}
signed main ()
{
    int m;
    f >> n >> m;
    while (m--)
    {

        int x, y;
        f >> x >> y;
        int tip;
        f >> tip;
        //x=get_nod(x), y=get_nod(y);
        if (tip==0)
            imposibil (neg(x), neg(y));
        if (tip==1)
            imposibil (neg(x), y);
        if (tip==2)
            imposibil (neg(y), x);
        if (tip==3)
            imposibil (x, y);
    }
    for (int i=1; i<=2*n; i++)
        if (!viz[i])
            dfs0(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++, dfs (lin[i]);
    }
    vector <int> ans;
    for (int i=1; i<=n; i++)
    {
        // cout <<ctc[i] << ' ' << ctc[i+n]<<'\n';
        if (ctc[i]>ctc[i+n])
            ans.push_back(i);
    }
    g << ans.size()<<'\n';
    for (auto x:ans)
        g << x << '\n';
}