Pagini recente » Cod sursa (job #482312) | Cod sursa (job #2009633) | Cod sursa (job #1263597) | Cod sursa (job #3355723) | Cod sursa (job #3313513)
// 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;
}