[欧拉回路] Codeforces 429E #245 (Div. 1) E. Points and Segments

来源:互联网 发布:软件项目实施方案 编辑:程序博客网 时间:2024/05/13 11:23

题解传送门:http://codeforces.com/blog/entry/12265


#include<cstdio>#include<cstdlib>#include<algorithm>using namespace std;inline char nc(){  static char buf[100000],*p1=buf,*p2=buf;  if (p1==p2) { p2=(p1=buf)+fread(buf,1,100000,stdin); if (p1==p2) return EOF; }  return *p1++;}inline void read(int &x){  char c=nc(),b=1;  for (;!(c>='0' && c<='9');c=nc()) if (c=='-') b=-1;  for (x=0;c>='0' && c<='9';x=x*10+c-'0',c=nc()); x*=b;}const int N=200005;struct edge{  int u,v,next;}G[N<<2];int head[N],inum=1;inline void add(int u,int v,int p){  G[p].u=u; G[p].v=v; G[p].next=head[u]; head[u]=p;}int deg[N];int dir[N<<2],vst[N];#define V G[p].vinline void dfs(int u){  vst[u]=1;  for (int p=head[u];p;p=G[p].next)    if (dir[p>>1]==-1){      dir[p>>1]=p&1;      dfs(V);    }}int sx[N],icnt;inline int Bin(int x){  return lower_bound(sx+1,sx+icnt+1,x)-sx;}int n,root;int s[N],t[N];int main(){  freopen("t.in","r",stdin);  freopen("t.out","w",stdout);  read(n);  for (int i=1;i<=n;i++)    read(s[i]),read(t[i]),t[i]++,sx[++icnt]=s[i],sx[++icnt]=t[i];  sort(sx+1,sx+icnt+1);  icnt=unique(sx+1,sx+icnt+1)-sx-1;  for (int i=1;i<=n;i++){    s[i]=Bin(s[i]),t[i]=Bin(t[i]);    add(s[i],t[i],++inum); add(t[i],s[i],++inum);    deg[s[i]]++; deg[t[i]]++;  }  int last=0;  for (int i=1;i<=icnt;i++)    if (deg[i]&1){      if (last)add(last,i,++inum),add(i,last,++inum),last=0;      elselast=i;    }  for (int i=1;i<=(inum>>1);i++) dir[i]=-1;  for (int i=1;i<=icnt;i++)    if (!vst[i])      dfs(i);  for (int i=1;i<=n;i++)    printf("%d ",dir[i]^1);  return 0;}


0 0
原创粉丝点击