题面

传送门

题目大意:

有n条线段,每条线段染红色或蓝色,使得数轴上每个点被红色线段覆盖的次数与被蓝色线段覆盖数差的绝对值小于等于1。输出染色方案。

分析

题意其实可以这样理解:

一段初始全为0 的序列a,给区间[li,ri]" role="presentation">[li,ri][li,ri]+1或-1,使得操作结束后序列中的所有位置绝对值不超过1

可采用差分的思想,给al+1,ar+1−1" role="presentation">al+1,ar+1−1al+1,ar+1−1把区间操作转化成单点操作

因此我们可以建图来模拟这个过程,从l到r+1连一条边,每个点的值就是入度与出度的差

建完图后,会出现多个连通块,若联通块是欧拉回路,则区间值为0

但是,图中会存在许多奇数度的点,必须要连边.

如果从一个奇点到另一个奇点连一条边,如果区间内还有一个奇点,则该点可能会被一种颜色覆盖多次,导致绝对值大于1

所以只能将相邻的奇点连边

总结:

1.线段右端点+1,离散化

2.将相邻奇数点连边,跑欧拉回路

3.输出方案,如果边是从左到右的,输出0,否则输出1

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<stack>
#define maxn 200005
using namespace std;
int n;
struct seg{
int l;
int r;
int dl;
int dr;
}a[maxn];
int m=0;
int tmp[maxn<<2];
int deg[maxn];
struct edge{
int from;
int to;
int next;
}E[maxn<<2];
int size=1;//从1开始存,这样一对反向边会存储在i和i^1的位置
int head[maxn];
int dir[maxn<<2];//记录每条边的方向
int used[maxn];
void add_edge(int u,int v){
size++;
E[size].from=u;
E[size].to=v;
E[size].next=head[u];
head[u]=size;
} void dfs(int x){
// printf("%d\n",x);
used[x]=1;
for(int i=head[x];i;i=E[i].next){
if(dir[i>>1]==-1){
dir[i>>1]=(i&1)^1;//如果i%2==1,则是从左到右的边,dir=0,否则dir=1
dfs(E[i].to);
}
}
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d %d",&a[i].l,&a[i].r);//区间很大,必须离散化
a[i].r++;
tmp[++m]=a[i].l;
tmp[++m]=a[i].r;
}
sort(tmp+1,tmp+1+m);
m=unique(tmp+1,tmp+1+m)-tmp-1;
for(int i=1;i<=n;i++){
a[i].dl=lower_bound(tmp+1,tmp+1+m,a[i].l)-tmp;
a[i].dr=lower_bound(tmp+1,tmp+1+m,a[i].r)-tmp;
add_edge(a[i].dl,a[i].dr);//连边
add_edge(a[i].dr,a[i].dl);
deg[a[i].dl]++;
deg[a[i].dr]++;
}
// printf("%d\n",m);
int pre=0;
for(int i=1;i<=m;i++){
if(deg[i]%2&&pre!=0){//相邻的奇数点连边
add_edge(i,pre);
add_edge(pre,i);
pre=0;
}else if(deg[i]%2){
pre=i;
}
}
for(int i=1;i<=size/2;i++){
dir[i]=-1;
}
for(int i=1;i<=m;i++){
if(!used[i]) dfs(i);//欧拉回路
}
for(int i=1;i<=n;i++){
printf("%d ",dir[i]);
}
}

Codeforces 429E(欧拉回路)的更多相关文章

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

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

  2. Codeforces 429E Points and Segments

    Description 题面 题目大意:有 \(n\) 个区间 \([L_i,R_i]\) ,你要给每一个区间染红蓝,使得每一个位置被红色染过的次数与被蓝色染过的次数差的绝对值不大于\(1\) Sol ...

  3. A - Points and Segments CodeForces - 429E

    题解: 方法非常巧妙的一道题 首先考虑要求全部为0怎么做 发现是个欧拉回路的问题(很巧妙) 直接dfs一遍就可以了 而这道题 要求是-1,1,0 我们可以先离散化 完了之后判断每个点被奇数还是偶数条边 ...

  4. Tanya and Password CodeForces - 508D (欧拉回路)

    大意:给定n个长为3的子串, 求一个长为n+2的字符串包含所有子串. 相邻两个字符开一个节点, 建图跑欧拉回路, 若存在的话长度一定是$\le n+2$.

  5. codeforces 429E

    题意:给定n<=100000线段[l,r],然后给这些线段染色(red or blue),求最后平面上任意一个点被蓝色及红色覆盖次数只差的绝对值不大于1 思路:把每条线段拆成2个点[l<& ...

  6. Codeforces Round #296 (Div. 1) C. Data Center Drama 欧拉回路

    Codeforces Round #296 (Div. 1)C. Data Center Drama Time Limit: 2 Sec  Memory Limit: 256 MBSubmit: xx ...

  7. Codeforces Gym 100431A Achromatic Number 欧拉回路

    原题链接:http://codeforces.com/gym/100431/attachments/download/2421/20092010-winter-petrozavodsk-camp-an ...

  8. Codeforces 1499G - Graph Coloring(带权并查集+欧拉回路)

    Codeforces 题面传送门 & 洛谷题面传送门 一道非常神仙的题 %%%%%%%%%%%% 首先看到这样的设问,做题数量多一点的同学不难想到这个题.事实上对于此题而言,题面中那个&quo ...

  9. Codeforces 1361C - Johnny and Megan's Necklace(欧拉回路)

    Codeforces 题目传送门 & 洛谷题目传送门 u1s1 感觉这个题作为 D1C 还是蛮合适的-- 首先不难发现答案不超过 \(20\),所以可以直接暴力枚举答案并 check 答案是否 ...

随机推荐

  1. iOS各别版本new Date().getTime 获取时间戳为null问题

    正常逻辑 new Date('2019-9-8').getTime() 注意日期格式 yyyy--mm-dd 因为yyyy/mm/dd也有兼容性问题 但是各别iOS版本不支持 // IOS 获取时间戳 ...

  2. 教父郭盛华透露:PHP编程语言中多个代码执行缺陷

    黑客无处不在,知名教父级网络安全专家郭盛华透露:“PHP编程语言其核心和捆绑库中的多个高严重性漏洞,其中最严重的漏洞可能允许黑客远程攻击者执行任意代码并破坏目标服务器. 超文本预处理器,通常称为PHP ...

  3. vscode-函数注释插件-正则插件

    1.安装插件KoroFileHeader(函数标准注释) 2.设置 在vscode左下角点击设置按钮,选择“设置”,然后输入“fileheader”, 文件头部注释:Fileheader:custom ...

  4. Linux php.ini的安全优化配置

    Linux php.ini的安全优化配置   (1) PHP函数禁用找到 disable_functions = 该选项可以设置哪些PHP函数是禁止使用的,PHP中有一些函数的风险性还是相当大的,可以 ...

  5. eclipse安装心得和环境变量配置的体会

    从昨天开始就开始安装eclipse,一开始觉得安装eclipse很简单,肯定就跟下个游戏差不多,但是打开官网之后发现下载的安装包不能用,经过搜索之后发现是因为下载源不对.改过下载源之后下载的安装包竟然 ...

  6. 部署至Oracle数据库的注意事项

    部署至Oracle数据库的注意事项 安装数据库之前1)检查计算机名,如果是乱码,改一下名字 2)有杀毒软件,能关则关               但是最好征求用户的同意 3)装两个一起解压databa ...

  7. 6353. 【NOIP2019模拟】给(ca)

    题目描述 题解 虫合 由于前几天被教♂育了,所以大力找了一发规律 先把m-1,设f[i][j]表示m≤i,有j个叶子节点的答案 转移显然,也显然是O(n^3)的 把f打出来后长这样: 1 1 1 1 ...

  8. 可用来修改bean对象的BeanPostProcessor

    可用来修改bean对象的BeanPostProcessor 11.1 简介 BeanPostProcessor是Spring中定义的一个接口,其与之前介绍的InitializingBean和Dispo ...

  9. 舞蹈课(dancingLessons)

    有n个人参加一个舞蹈课.每个人的舞蹈技术由整数ai来决定.在舞蹈课的开始,他们从左到右站成一排.当这一排中至少有一对相邻的异性时,舞蹈技术相差最小的那一对会出列并开始跳舞.如果相差最小的不止一对,那么 ...

  10. #1114-JSP指令

    JSP 指令 JSP指令用来设置整个JSP页面相关的属性,如网页的编码方式和脚本语言. 语法格式如下: <%@ directive attribute = "value"%& ...