Cod sursa(job #3313513)

Utilizator Ilie_MityIlie Dumitru Ilie_Mity Data 4 octombrie 2025 21:51:21
Problema Nowhere-zero Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.33 kb
// Ilie "The-Winner" Dumitru
// Dumnezeu sa o ierte
#include<bits/stdc++.h>
#define sz(x) ((int)(x).size())
#define all(x) (x).begin(), (x).end()
#define err(...) fprintf(stderr, __VA_ARGS__)
using ll=long long;
constexpr int NMAX=100'005, MMAX=NMAX*12;
constexpr ll MOD=1'000'000'007;

struct pct
{
	long double x, y;

	bool operator<(pct o) const
	{
		if(x!=o.x)
			return x<o.x;
		return y<o.y;
	}

	bool left() const
	{
		pct p={0, 0};
		return p<*this;
	}
};

int N, M;
pct v[NMAX];

struct seg
{
	int u, v, i;

	bool operator<(seg o) const
	{
		if(::v[u].x!=::v[o.u].x)
			return ::v[u].x<::v[o.u].x;
		if(::v[u].y!=::v[o.u].y)
			return ::v[u].y<::v[o.u].y;
		pct& p=::v[v];
		pct& q=::v[o.v];
		if(p.left()!=q.left())
			return p.left()<q.left();
		return p.x*q.y-q.x*p.y>0;
	}
};

seg E[MMAX];
int nxt[MMAX];
int face[MMAX], F;
std::set<int> G[NMAX*5];
int deg[MMAX*5];
int col[NMAX*5];
int init_u[MMAX], init_v[MMAX];

int main()
{
	FILE* f=fopen("nowhere-zero.in", "r"), *g=fopen("nowhere-zero.out", "w");
	int i, j, x, y;

	fscanf(f, "%d%d", &N, &M);
	for(i=0;i<N;++i)
		fscanf(f, "%Lf%Lf", &v[i].x, &v[i].y);
	for(i=0;i<M;++i)
	{
		fscanf(f, "%d%d", &x, &y);
		init_u[i]=x--;
		init_v[i]=y--;
		E[i*2].u=x;
		E[i*2].v=y;
		E[i*2].i=i*2;
		E[i*2+1].v=x;
		E[i*2+1].u=y;
		E[i*2+1].i=i*2+1;
	}

	std::sort(E, E+M*2);

	for(i=0;i<M*2;++i)
	{
		for(j=i+1;j<M*2 && E[i].u==E[j].u;++j);
		nxt[E[j-1].i^1]=E[i].i;
		for(--j;i<j;++i)
			nxt[E[i].i^1]=E[i+1].i;
	}

	for(i=0;i<M*2;++i)
		face[i]=-1;
	for(i=0;i<M*2;++i)
		if(face[i]==-1)
		{
			for(j=i;face[j]==-1;j=nxt[j])
				face[j]=F;
			++F;
		}

	for(i=0;i<M;++i)
		if(face[i*2]!=face[i*2+1])
		{
			G[face[i*2]].insert(face[i*2+1]);
			G[face[i*2+1]].insert(face[i*2]);
		}

	std::stack<int> s, r;
	for(i=0;i<F;++i)
	{
		deg[i]=sz(G[i]);
		if(deg[i]<6)
			s.push(i);
	}

	while(!s.empty())
	{
		x=s.top();
		s.pop();
		r.push(x);

		for(int o : G[x])
			if(--deg[o]==5)
				s.push(o);
	}

	while(!r.empty())
	{
		x=r.top();
		r.pop();
		std::set<int> ngh;

		for(int o : G[x])
			ngh.insert(col[o]);
		for(i=1;i<6 && ngh.count(i);++i);
		col[x]=i;
	}

	for(i=0;i<M;++i)
	{
		if(col[face[i*2+1]]>col[face[i*2]])
			fprintf(g, "%d %d %d\n", init_u[i], init_v[i], col[face[i*2+1]]-col[face[i*2]]);
		else
			fprintf(g, "%d %d %d\n", init_v[i], init_u[i], col[face[i*2]]-col[face[i*2+1]]);
	}

	fclose(f);
	fclose(g);
	return 0;
}