励志的猴子

Time Limit: 1000 MS     Memory Limit: 256 MB
Submit Status

上图是2013南京亚青会吉祥物圆圆。自从它诞生以来,它就被吐槽为最丑吉祥物。即使如此,它仍然坚强的活着,并且……它还学会了人类的坐标系、画画和数学,成为了猴界的全才。看到它这么努力,你还有理由不努力吗!

虽然如此努力,圆圆受限于猴子的脑容量,还是差了一点——它只能掌握一维坐标系,画画只能分辨两种颜色,数学上只会不等式,只能认识整数。这一天,圆圆很无聊,于是它拿起一维坐标纸,想在纸上画n条线段,第i条线段从坐标轴的xi延伸到yi(包括端点)。

励志的圆圆想要展示一下自己的智商,它用红蓝彩笔画下这n条线段,并且希望对于坐标轴上任意一个点,经过它的红线和蓝线数量的绝对值之差小于等于1.如果某个点是线段的端点,则这条线段也算作经过该点。

不过这时,圆圆发现自己的算数能力还是有点差,于是它找到了你,希望你确定每条线段的颜色,来满足它的奇思妙想。

Input

第一行一个整数n(1 ≤ n ≤ 100000), 表示圆圆画的线段的数量。

接下来n行,每行两个整数x,y( 0≤ x ≤ y ≤ 109109 ),表示一条线段从x延伸到y。

Output

输出n个数,用空格隔开,如果第i条线段是蓝色,则输出0,否则输出1.

如果有多组解,输出一组即可。

如果找不到答案,输出一个数-1.

Sample input and output

Sample Input Sample Output
2
1 2
2 3
0 1
6
1 5
1 3
3 5
2 10
11 11
12 12
0 1 1 0 0 1

Hint

样例1: 第一条线段是蓝色,第二条线段是红色。

两组样例都可能有其他正确答案。

Source

2018 UESTC ACM Training for Graph Theory    
题解:观察发现,仅当一条线段结束或开始时,染色情况才可能有变化。若将所有线段表示为[L,R],则将它们全部延伸至[L,R+1),就无需单独考虑整点。    
将所有左边界和右边界+1位置的整点去重排序,形成集合 {x1, x2, ..., xk},则只需考虑区间[0, x1) [x1, x2) ... [xk-1, xk) [xk, ∞) 。    [0, x1) [x1, x2) ... [xk-1, xk) [xk, ∞) 
     X1        X2     ...       Xk         Xk+1
若将一个区间涂色,则所有包含这个区间的线段都要被涂色。
把这些区间看做图的节点,把线段看做图的边。
例如:对于一条包含区间{Xi, Xi+1, ..., Xj-1, Xj} 的线段,可以视为点i连向点j+1的一条无向边。这样,就组成了多个连通图。
对于每个连通图,我们需要把这些边按相同的方法涂色,就能解决问题。
假设:连通图当中,所有节点的度数都为偶数。

那么,图中所有边组成的一条路径构成了一条欧拉回路。

代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6;
const int maxn1=3e5;
struct part{
int v,id;
} ee[maxn];

struct part1{
int to,net;
} e[maxn];

int b[maxn],c[maxn],d[maxn],vis[maxn],flag[maxn],cnt,n,k,len;
int a[maxn],v[maxn],g[maxn1],head[maxn1],st[maxn1],du[maxn1],emp[maxn1],top,s[maxn1],f[maxn1];

bool cmp(part a,part b)
{
    return a.v<b.v;
}

void addedge(int x,int y)
{
    v[cnt]=0;
    e[cnt].to=y;
    e[cnt].net=st[x];
    st[x]=cnt++;
}

void dfs(int x)
{
    if(emp[x]==1) return ;
    top++;
    s[top]=x;
    int ii=st[x];
    while (ii!=-1&&v[ii]) ii=e[ii].net;
    st[x]=ii;
    if(ii==-1) 

emp[x]=1;
return ; 
}
    if(ii!=-1)
    {
        v[ii]=1;
        st[x]=e[ii].net;
        if (st[x]==-1) emp[x]=1;
        int p=e[ii].to;
        int jj=ii^1;
        v[jj]=1;
        dfs(p);
    }
}

void fluey(int x)
{
    top=0;
    s[top]=x;
    while(top>=0)
    {
        if (emp[s[top]]==1)
        {
            len+=1;
            f[len]=s[top];
            flag[s[top]]=1;
            top--;
        } 
else
        {
            top--;
            dfs(s[top+1]);
        }
    }
}

int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
    cin>>n;
    int temp=0,x,y;
    for(int i=1;i<=n;i++)
    {
        cin>>x>>y;
        temp+=1;
        ee[temp].v=x;
        ee[temp].id=i;
        temp+=1;
        ee[temp].v=y+1;
        ee[temp].id=i+n;
    }

    sort(ee+1,ee+1+2*n,cmp);
    for(int i=1;i<=2*n;i++) c[ee[i].id]=i;
    d[1]=ee[1].v;
    b[1]=1;
    k=1;
    for(int i=2;i<=2*n;i++) 
    {
    if(ee[i].v==d[k]) { b[i]=k; continue; } 
else { k++; d[k]=ee[i].v; b[i]=k; }
    
    cnt=0;
    for(int i=1;i<=n*2;i++) st[i]=-1;
    for(int i=1;i<=n;i++)
    {
        addedge(b[c[i]],b[c[i+n]]);
        addedge(b[c[i+n]],b[c[i]]);
        du[b[c[i]]]++;
        du[b[c[i+n]]]++;
        v[i-1]=0;
        v[i+n-1]=0;
    }

    temp=0;
    for(int i=1;i<=2*n;i++)
    if(du[i]&1) a[++temp]=i;   
   
    sort(a+1,a+1+temp);
    for(int i=1;i<=temp;i++)
    if(i & 1)
    {
        addedge(a[i],a[i+1]);
        addedge(a[i+1],a[i]);
        du[a[i]]+=1;
        du[a[i+1]]+=1;
    }
    for(int i=1;i<=n*2;i++)
    {
    if(du[i]>0) emp[i]=0; 
else emp[i]=1;
}
        
    for(int i=1;i<=2*n;i++) head[i]=st[i];
    for(int j=1;j<=2*n;j++)
    {
    if(!flag[j] && du[j]>0)
    {
      len=0;
      fluey(j);
      memset(vis,0,sizeof vis);
      for(int i=1;i<=len-1;i++)
      {
        x=f[i]; y=f[i+1];
        int ii=head[x];
        while(ii!=-1)
        {
            if(e[ii].to==y && vis[ii]==0) break;
            ii=e[ii].net;
        }
        if(x<y) g[ii/2+1]=1; 
else g[ii/2+1]=0;
        vis[ii]=1;
        vis[ii^1]=1;
      }
    }
}
    for(int i=1;i<=n;i++) i==n? cout<<g[i]<<endl : cout<<g[i]<<" ";
    return 0;
}

转化欧拉回路(难题)-UESTC-1957励志的猴子的更多相关文章

  1. 省时省心DTM,广告转化无难题

    内容来源:华为开发者大会2021 HMS Core 6 App Services技术论坛,主题演讲<华为分析服务,助您打造数智化运营闭环方案>. 演讲嘉宾:华为消费者云服务 分析产品总监 ...

  2. UVa 12118 检查员的难题(dfs+欧拉回路)

    https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  3. php猴子称王或者约瑟夫难题

    问题描述: 一群猴子排成一圈,按1,2,...,n依次编号.然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去...,如此不停的进行下去,直到最后只剩下一只猴子为 ...

  4. CodeForces - 547D: Mike and Fish (转化为欧拉回路)(优化dfs稠密图)(定向问题)

    As everyone knows, bears love fish. But Mike is a strange bear; He hates fish! The even more strange ...

  5. UVA 10054 The Necklace 转化成欧拉回路

    题意比较简单,给你n个项链碎片,每个碎片的两半各有一种颜色,最后要把这n个碎片串成一个项链,要求就是相邻碎片必须是同种颜色挨着. 看了下碎片总共有1000个,颜色有50种,瞬间觉得普通方法是无法在可控 ...

  6. UVA - 12118 Inspector's Dilemma(检查员的难题)(欧拉回路)

    题意:有一个n个点的无向完全图,找一条最短路(起点终点任意),使得该道路经过E条指定的边. 分析: 1.因为要使走过的路最短,所以每个指定的边最好只走一遍,所以是欧拉道路. 2.若当前连通的道路不是欧 ...

  7. POJ 1637 混合图的欧拉回路判定

    题意:一张混合图,判断是否存在欧拉回路. 分析参考: 混合图(既有有向边又有无向边的图)中欧拉环.欧拉路径的判定需要借助网络流! (1)欧拉环的判定:一开始当然是判断原图的基图是否连通,若不连通则一定 ...

  8. LightOJ1086 Jogging Trails(欧拉回路+中国邮递员问题+SPFA)

    题目求从某点出发回到该点经过所有边至少一次的最短行程. 这个问题我在<图论算法理论.实现及应用>中看过,是一个经典的问题——中国邮递员问题(CPP, chinese postman pro ...

  9. nyist 673 悟空的难题

    http://acm.nyist.net/JudgeOnline/problem.php?pid=673 悟空的难题 时间限制:1000 ms  |  内存限制:65535 KB 难度:2   描述 ...

随机推荐

  1. Elasticsearch生产环境遇到的问题以及解决方案

    Elasticsearch是一个开源的分布式实时搜索与分析引擎,支持云服务.它是基于Apache Lucene搜索引擎的类库创建的,提供了全文搜索能力.多语言支持.专门的查询语言.支持地理位置服务.基 ...

  2. c#属性(Property)

    属性(Property)是类(class).结构(structure)和接口(interface)的命名(named)成员.类或结构中的成员变量或方法称为 域(Field).属性(Property)是 ...

  3. 如何查看当前linux服务器是否支持虚拟化

    [root@localhost ~]# grep -E '(svm|vmx)' /proc/cpuinfo 或者: [root@localhost ~]# cat /proc/cpuinfo 找到fl ...

  4. echo -e的扩展应用之颜色控制输出(字体+背景)

    echo -e 输出带颜色字体或者背景用法:example: echo -e "\033[41;36m something here \033[0m" 其中41的位置代表底色, 3 ...

  5. nyoj 51-管闲事的小明(遍历,比较)

    51-管闲事的小明 内存限制:64MB 时间限制:4000ms Special Judge: No accepted:9 submit:20 题目描述: 某校大门外长度为L的马路上有一排树,每两棵相邻 ...

  6. kafka connector 使用总结以及自定义connector开发

    Kafaka connect 是一种用于在Kafka和其他系统之间可扩展的.可靠的流式传输数据的工具.它使得能够快速定义将大量数据集合移入和移出Kafka的连接器变得简单.Kafka Connect可 ...

  7. Install Elastic stack

    1. 安装环境 系统版本:centos 6.9 java版本:1.8.0_181 程序版本:6.6 (整个stack需保持相同的版本) 2. 安装顺序 1 Elasticsearch 2 Kibana ...

  8. 【Luogu P1090】合并果子

    Luogu P1090 [解题思路] 刚看到这题的时候,第一反应就是每次取两个最小,然后重新排序,再取最小.但是这样会TLE. 既然找最小的,那就可以利用单调队列了.显然输入的数据是不具有单调性的,但 ...

  9. 请求头里显示Provisional headers are shown的问题

    1.问题描述: 在工作中遇到了一个坑.登录一个系统的时候,退出登录不好使了,前端确实调用了logout的接口(退出接口),但是这个接口的请求头显示Provisional headers are sho ...

  10. java程序员面试宝典之——Java 基础部分(1~10)

    基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语法,集合的语法,io 的语法,虚拟机方面的语法. 1.一个".java"源文件中是否可以包 ...