传送门


如果把一条线段\([l,r]\)看成一条无向边\((l,r+1)\),从\(l\)走到\(r+1\)表示线段\([l,r]\)染成红色,从\(r+1\)走到\(l\)表示线段\([l,r]\)染成蓝色,那么题目等价于给每一条边定下方向,使得对于所有点,从左往右经过的次数和从右往左经过的次数差的绝对值不超过\(1\)。

对于直线上所有奇数度的点,从左往右两两配对,那么就是要求对于所有的点从左往右经过的次数等于从右往左经过的次数。不难想到这是一个欧拉图。求解欧拉回路给边定向即可。

注意直线上的奇数度的点不能随意配对,因为如果对于\(A<B<C<D\)四个奇数入度的点,连\((A,D)\)\((B,C)\),而找到的欧拉回路方案中边的方向为\(A \rightarrow D , B \rightarrow C\),那么在这两条边去掉之后线段\([B,C]\)从左往右的次数比从右往左的次数少\(2\),就不符合题意了。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iomanip>
#include<set>
#include<vector>
//This code is written by Itst
using namespace std; inline int read(){
int a = 0;
char c = getchar();
while(!isdigit(c))
c = getchar();
while(isdigit(c)){
a = a * 10 + c - 48;
c = getchar();
}
return a;
} #define PII pair < int , int >
const int MAXN = 2e5 + 7;
multiset < PII > Edge[MAXN];
int lsh[MAXN] , in[MAXN] , N , cntL;
vector < PII > tmp;
bool col[MAXN]; void dfs(int x){
for(auto t = Edge[x].begin() ; !Edge[x].empty() ; t = Edge[x].begin()){
int a = t->first , b = t->second;
Edge[x].erase(t);
Edge[a].erase(Edge[a].find(PII(x , -b)));
if(b > 0) col[b] = 1;
dfs(a);
}
} int main(){
#ifndef ONLINE_JUDGE
freopen("in","r",stdin);
//freopen("out","w",stdout);
#endif
N = read();
for(int i = 1 ; i <= N ; ++i){
int a = read() , b = read() + 1;
tmp.push_back(PII(a , b));
lsh[++cntL] = a; lsh[++cntL] = b;
}
sort(lsh + 1 , lsh + cntL + 1);
cntL = unique(lsh + 1 , lsh + cntL + 1) - lsh - 1;
for(int i = 0 ; i < N ; ++i){
int p = lower_bound(lsh + 1 , lsh + cntL + 1 , tmp[i].first) - lsh , q = lower_bound(lsh + 1 , lsh + cntL + 1 , tmp[i].second) - lsh;
Edge[p].insert(PII(q , i + 1));
Edge[q].insert(PII(p , -i - 1));
in[p] ^= 1; in[q] ^= 1;
}
int pre = 0;
for(int i = 1 ; i <= cntL ; ++i)
if(in[i])
if(!pre) pre = i;
else{
Edge[pre].insert(PII(i , 0));
Edge[i].insert(PII(pre , 0));
++in[pre]; ++in[i];
pre = 0;
}
for(int i = 1 ; i <= cntL ; ++i)
if(!Edge[i].empty())
dfs(i);
for(int i = 1 ; i <= N ; ++i)
cout << col[i] << ' ';
return 0;
}

CF429E Points and Segments 构造、欧拉回路的更多相关文章

  1. 【CF429E】Points and Segments(欧拉回路)

    [CF429E]Points and Segments(欧拉回路) 题面 CF 洛谷 题解 欧拉回路有这样一个性质,如果把所有点在平面内排成一行,路径看成区间的覆盖,那么每个点被从左往右的覆盖次数等于 ...

  2. CF429E Points and Segments

    链接 CF429E Points and Segments 给定\(n\)条线段,然后给这些线段红蓝染色,求最后直线上上任意一个点被蓝色及红色线段覆盖次数之差的绝对值不大于\(1\),构造方案,\(n ...

  3. 【CF429E】 Points and Segments(欧拉回路)

    传送门 CodeForces 洛谷 Solution 考虑欧拉回路有一个性质. 如果把点抽出来搞成一条直线,路径看成区间覆盖,那么一个点从左往右被覆盖的次数等于从右往左被覆盖的次数. 发现这个性质和本 ...

  4. Codeforces 429E - Points and Segments(欧拉回路)

    Codeforces 题面传送门 & 洛谷题面传送门 果然我不具备融会贯通的能力/ll 看到这样的设问我们可以很自然地联想到这道题,具体来说我们可以通过某种方式建出一张图,然后根据" ...

  5. 【CF429E】Points and Segments 欧拉回路

    [CF429E]Points and Segments 题意:给你数轴上的n条线段$[l_i,r_i]$,你要给每条线段确定一个权值+1/-1,使得:对于数轴上的任一个点,所有包含它的线段的权值和只能 ...

  6. [CF429E]Points ans Segments_欧拉回路

    Points and Segments 题目链接:www.codeforces.com/contest/429/problem/E 注释:略. 题解: 先离散化. 发现每个位置如果被偶数条线段覆盖的话 ...

  7. Codeforces Round #245 (Div. 2) A. Points and Segments (easy) 贪心

    A. Points and Segments (easy) Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://codeforces.com/con ...

  8. 『ACM C++』 Codeforces | 1066A - Points in Segments

    大一生活真 特么 ”丰富多彩“ ,多彩到我要忙到哭泣,身为班长,很多班级的事情需要管理,也是,什么东西都得体验学一学,从学生会主席.团委团总支.社团社长都体验过一番了,现在差个班长也没试过,就来体验了 ...

  9. Codeforces Round #501 (Div. 3) 1015A Points in Segments (前缀和)

    A. Points in Segments time limit per test 1 second memory limit per test 256 megabytes input standar ...

随机推荐

  1. 利用SurfaceView显示正弦曲线,仿造示波器

    众所周知,view是通过刷新来重绘视图的,Android系统通过发出VSYNC信号来进行屏幕重绘,刷新的时间间隔为16ms,如果在16ms内view完成你所需要的所有操作,那么用户在视觉上就不会产生卡 ...

  2. MySQL 横向表分区之RANGE分区小结

    MySQL 横向表分区之RANGE分区小结 by:授客 QQ:1033553122 目录 简介 1 RANGE分区 1 创建分区表 1 查看表分区 2 新增表分区 2 新增数据 3 分区表查询 3 删 ...

  3. 「Android」单例的五种写法

    单例 发现博客园可以很好的设置自己的博客文章的展示,很开心,然后特此发一篇 其实这几种写法大家应该都会的,就权当拿来记录一下吧,以后复习巩固也比较方便. 这篇文章中的代码,来自一篇视频(我想找视频贴上 ...

  4. <自动化测试方案_5>第五章、代码单元自动化测试

    第五章.代码单元自动化测试 代码单元测试需要根据编程语言,选择单元测试框架,然后访问类方法,函数.代码单元测试做自动化,相比API.UI自动化做起来更加麻烦,建议放到待API自动化测试.UI自动化测试 ...

  5. 算法:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。

    算法:用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型.<剑指offer> 利用栈来进行操作,代码注释写的比较清楚:首先判断两个栈是否是空的:其次当栈二 ...

  6. (办公)Spring boot(系列)的返回json封装类

    package com.imooc.util; import com.fasterxml.jackson.databind.ObjectMapper; /** * 自定义响应数据结构: * 这个类是提 ...

  7. 2017.9.16~17,热烈庆祝共创力罗老师《敏捷MINI体验式实战培训》在某大型企业成功举办!

    2017.9.16~17日,深圳市共创力企业管理咨询有限公司为某上市企业提供了为期两天的内训服务.该次内训的主题为<敏捷MINI体验式实践培训>,为期两天.此次培训由共创力资深讲师Geor ...

  8. C#调用原生C++ COM对象(在C++中实现C#的接口)

    为了跨平台在.net core中使用COM,不能使用Windows下的COM注册机制,但是可以直接把IUnknown指针传给C#,转换为指针,再转换为C#的接口(interface). 做了这方面的研 ...

  9. windows虚拟内存机制

    在windows系统中个,每个进程拥有自己独立的虚拟地址空间(Virtual Address Space).这一地址空间的大小与计算机硬件.操作系统以及应用程序都有关系. 对于32位程序来说,最多能使 ...

  10. Oracle EBS when-validate-record 个性化无效果

    在对FORM进行个性化时,针对对应块添加 when-validate-record ,结果做实验的时候无效果. 原因: FORM 中对应的 BLOCK 没有 when-validate-record ...