Cod sursa(job #2604873)

Utilizator bluestorm57Vasile T bluestorm57 Data 23 aprilie 2020 18:13:25
Problema Felinare Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.29 kb
#include <bits/stdc++.h>

using namespace std;

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

const int NMAX = 9005;
int n,m;
vector < int > vo[NMAX],vi[NMAX];
pair < int, int > ao[NMAX], ai[NMAX];
int vizo[NMAX], vizi[NMAX];
int anso[NMAX], ansi[NMAX];
int ans;

int main(){
    int i,j,x,y;
    f >> n >> m;
    for(i = 1 ; i <= m ; i++){
        f >> x >> y;
        vo[x].push_back(y);
        vi[y].push_back(x);
    }

    for(i = 1 ; i <= n ; i++){
        ao[i].first = vo[i].size();
        ai[i].first = vi[i].size();
        ao[i].second = ai[i].second = i;
    }

    sort(ao + 1, ao + n + 1);
    sort(ai + 1, ai + n + 1);

    i = j = 1;
    while(i <= n && ao[i].first == 0){
        ans++;
        vizo[ao[i].second] = 1;
        anso[ao[i].second] = 1;
        i++;
    }
    while(j <= n && ai[j].first == 0){
        ans++;
        vizi[ai[j].second] = 1;
        ansi[ai[j].second] = 1;
        j++;
    }

    while(i <= n && j <= n){

        while(i <= n && vizo[ao[i].second] )
            i++;
        while(j <= n && vizi[ai[j].second] )
            j++;

        if(i <= n && j <= n){

            if(ao[i].first <= ai[j].first){

                ans++;
                for(auto it: vo[ao[i].second])
                    vizi[it] = 1;
                vizo[ao[i].second] = 1;
                anso[ao[i].second] = 1;

            }else{

                ans++;
                for(auto it: vi[ai[i].second])
                    vizo[it] = 1;
                vizi[ai[j].second] = 1;
                ansi[ai[j].second] = 1;

            }

        }else
            if(i <= n){

                ans++;
                vizo[ao[i].second] = 1;
                anso[ao[i].second] = 1;

            }else
                if(j <= n){

                    ans++;
                    vizi[ai[j].second] = 1;
                    ansi[ai[j].second] = 1;

                }

    }

    g << ans << "\n";

    for(i = 1 ; i <= n ; i++)
        if(ansi[i] && anso[i])
            g << 3 << "\n";
        else
            if(ansi[i])
                g << 2 << "\n";
            else
                if(anso[i])
                    g << 1 << "\n";
                else
                    g << 0 << "\n";

    return 0;
}