转化欧拉回路(难题)-UESTC-1957励志的猴子
励志的猴子
Time Limit: 1000 MS Memory Limit: 256 MB

上图是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 |
0 1 |
6 |
0 1 1 0 0 1 |
Hint
样例1: 第一条线段是蓝色,第二条线段是红色。
两组样例都可能有其他正确答案。
Source
X1 X2 ... Xk Xk+1
若将一个区间涂色,则所有包含这个区间的线段都要被涂色。
把这些区间看做图的节点,把线段看做图的边。
例如:对于一条包含区间{Xi, Xi+1, ..., Xj-1, Xj} 的线段,可以视为点i连向点j+1的一条无向边。这样,就组成了多个连通图。
对于每个连通图,我们需要把这些边按相同的方法涂色,就能解决问题。
那么,图中所有边组成的一条路径构成了一条欧拉回路。
代码:
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励志的猴子的更多相关文章
- 省时省心DTM,广告转化无难题
内容来源:华为开发者大会2021 HMS Core 6 App Services技术论坛,主题演讲<华为分析服务,助您打造数智化运营闭环方案>. 演讲嘉宾:华为消费者云服务 分析产品总监 ...
- UVa 12118 检查员的难题(dfs+欧拉回路)
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- php猴子称王或者约瑟夫难题
问题描述: 一群猴子排成一圈,按1,2,...,n依次编号.然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去...,如此不停的进行下去,直到最后只剩下一只猴子为 ...
- 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 ...
- UVA 10054 The Necklace 转化成欧拉回路
题意比较简单,给你n个项链碎片,每个碎片的两半各有一种颜色,最后要把这n个碎片串成一个项链,要求就是相邻碎片必须是同种颜色挨着. 看了下碎片总共有1000个,颜色有50种,瞬间觉得普通方法是无法在可控 ...
- UVA - 12118 Inspector's Dilemma(检查员的难题)(欧拉回路)
题意:有一个n个点的无向完全图,找一条最短路(起点终点任意),使得该道路经过E条指定的边. 分析: 1.因为要使走过的路最短,所以每个指定的边最好只走一遍,所以是欧拉道路. 2.若当前连通的道路不是欧 ...
- POJ 1637 混合图的欧拉回路判定
题意:一张混合图,判断是否存在欧拉回路. 分析参考: 混合图(既有有向边又有无向边的图)中欧拉环.欧拉路径的判定需要借助网络流! (1)欧拉环的判定:一开始当然是判断原图的基图是否连通,若不连通则一定 ...
- LightOJ1086 Jogging Trails(欧拉回路+中国邮递员问题+SPFA)
题目求从某点出发回到该点经过所有边至少一次的最短行程. 这个问题我在<图论算法理论.实现及应用>中看过,是一个经典的问题——中国邮递员问题(CPP, chinese postman pro ...
- nyist 673 悟空的难题
http://acm.nyist.net/JudgeOnline/problem.php?pid=673 悟空的难题 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 ...
随机推荐
- pssh系列工具
一.pssh简介及安装 首先我们来了解下什么是pssh,它是干嘛用的?pssh是一个python编写可以在多台服务器上执行命令的工具,也可以实现文件复制.换而言之就是一个批量管理多台服务器的一个小工具 ...
- Rxjava2源码解析
1:用法: Observable<Integer> observable = Observable.create(new ObservableOnSubscribe<Integer& ...
- 【实战】如何通过html+css+mysql+php来快速的制作动态网页(以制作一个博客网站为列)
一.开发环境的搭建 (1)apache+php+mysql环境搭建 因为要用apache来做服务器,mysql作为数据库来存储数据,php来写代码以此实现网页与数据库的交互数据,所以需要下载上述软件, ...
- 搭建Redis三主三从集群
Redis三主三从集群规划 10.0.128.19 使用端口 7000 7001 10.0.128.22 使用端口 7002 7003 10.0.128.23 使用端口 7004 7 ...
- 发送大数据时,PDU的问题?
昨天发现通过 Ice发送请求传递一个大块数据时,当请求的体积大于1.2M后,直接抛出异常Connection Lost,对方peer或是断开了.通过防火墙配置排查,以及对同一网络同一机器的php服务p ...
- Ubuntu网络network eth0配置 | ubuntu network configuration
本文首发于个人博客https://kezunlin.me/post/5076bc45/,欢迎阅读! ubuntu network configuration Guide network proxy S ...
- AppBoxFuture: 集成第三方Sql数据库
框架设计之初是不准备支持第三方数据库的,但最近几个朋友都提到需要将旧的基于传统Sql数据库的应用迁移到框架内,主要是考虑到一方面目前框架内置的分布式数据库尚未完善,另一方面是希望能逐步迭代旧应用替 ...
- Towards Universal Object Detection by Domain Attention
论文及代码 论文地址:https://arxiv.org/abs/1904.04402 代码:http://www.svcl.ucsd.edu/projects/universal-detection ...
- 利用Spring AOP的通知类型以及创建通知
写在最前端 1.SpringAOP中共有六种通知类型,只要我们自定义一个类实现对应的接口,它们全都是org.springframework.aop包中的. 2.AOP的连接点可以是方法调用.方法调用本 ...
- 【数据结构】之栈(Java语言描述)
在前面的[这篇文章]中,我简单介绍了栈这种数据结构的操作功能,并使用C语言对其进行了代码的编写. Java的JDK中默认为我们提供了栈这种数据结构的API—— Stack . Java中的Stack类 ...