Cod sursa(job #1928968)

Utilizator alexpetrescuAlexandru Petrescu alexpetrescu Data 16 martie 2017 22:03:05
Problema Nowhere-zero Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.4 kb
#include <cstdio>
#include <set>
#include <cmath>
#include <algorithm>
#include <utility>
#include <map>

#define MAXN 100000
#define MAXK 200009
#define MAXM 600099

struct myc{
    int x, y;
    myc(int _x, int _y){
        x=_x;
        y=_y;
    }
};

std::set <long long> graf;

int sef;
std::vector <bool> viz[MAXN+1];
std::vector <myc> g[MAXN+1];
std::map <int, int> mp[MAXN+1];
double x[MAXN+1], y[MAXN+1];

int a[MAXM], b[MAXM], moaca[MAXM];

bool done[MAXK+1], ok[7];
int q[MAXK+1], unde[MAXK+1], gr[MAXK+1];
char cul[MAXK+1];
std::vector <int> v[MAXK+1];

bool cmp(const myc &a, const myc &b){
    return atan2(y[a.x]-y[sef], x[a.x]-x[sef])<atan2(y[b.x]-y[sef], x[b.x]-x[sef]);
}

int main(){
    FILE *fin, *fout;
    fin=fopen("nowhere-zero.in", "r");
    fout=fopen("nowhere-zero.out", "w");

    int n, m;
    fscanf(fin, "%d%d", &n, &m);

    for(int i=1; i<=n; i++)
        fscanf(fin, "%lf%lf", &x[i], &y[i]);

    for(int i=0; i<2*m; i+=2){
        fscanf(fin, "%d%d", &a[i], &b[i]);

        a[i+1]=b[i];
        b[i+1]=a[i];

        g[a[i]].push_back(myc(b[i], i));
        g[b[i]].push_back(myc(a[i], i+1));
    }

    for(int i=1; i<=n; i++){
        sef=i;
        std::sort(g[i].begin(), g[i].end(), cmp);
        for(int j=0; j<(int)g[i].size(); j++)
            viz[i].push_back(0);
        for(int j=0; j<(int)g[i].size(); j++)
            mp[i][g[i][j].x]=j;

    }

    int k=0;
    for(int i=1; i<=n; i++){
        for(int j=0; j<(int)g[i].size(); j++) if(viz[i][j]==0){
            int x=i;
            myc y=g[i][j];
            k++;
            while(y.x!=i){
                moaca[y.y]=k;
                viz[x][mp[x][y.x]]=1;
                int aux=x;
                x=y.x;
                int poz=mp[x][aux]-1;
                if(poz==-1)
                    poz=g[x].size()-1;
                y=g[x][poz];
            }

            moaca[y.y]=k;
            viz[x][mp[x][y.x]]=1;
        }
    }

    for(int i=0; i<2*m; i+=2){
        if(graf.find((1LL<<30)*std::min(moaca[i], moaca[i+1])+std::max(moaca[i], moaca[i+1]))==graf.end()){
            graf.insert((1LL<<30)*std::min(moaca[i], moaca[i+1])+std::max(moaca[i], moaca[i+1]));
            v[moaca[i]].push_back(moaca[i+1]);
            v[moaca[i+1]].push_back(moaca[i]);
        }
    }

    int st=0, dr=0;
    for(int i=1; i<=k; i++){
        gr[i]=v[i].size();
        if(gr[i]<=5){
            unde[i]=dr;
            q[dr++]=i;
            done[i]=1;
        }
    }

    while(st<dr){
        for(auto x:v[q[st]]){
            if(done[x]==0){
                gr[x]--;
                if(gr[x]==5){
                    unde[x]=dr;
                    q[dr++]=x;
                    done[x]=1;
                }
            }
        }
        st++;
    }

    for(int i=k-1; i>=0; i--){
        for(int j=1; j<=6; j++)
            ok[j]=1;

        for(auto x:v[q[i]])
            if(unde[x]>unde[q[i]])
                ok[(int)cul[x]]=0;

        for(int j=1; j<=6; j++)
            if(ok[j])
                cul[q[i]]=j;
    }

    for(int i=0; i<2*m; i+=2){
        int sol;
        if(cul[moaca[i]]>cul[moaca[i+1]])
            sol=i;
        else sol=i+1;

        int ans=cul[moaca[sol]]-cul[moaca[sol^1]];

        fprintf(fout, "%d %d %d\n", a[sol], b[sol], ans);
    }

    fclose(fin);
    fclose(fout);
    return 0;
}