Codeforces 题面传送门 & 洛谷题面传送门

果然我不具备融会贯通的能力/ll

看到这样的设问我们可以很自然地联想到这道题,具体来说我们可以通过某种方式建出一张图,然后根据”每个点度都是偶数的图必然每个连通块都存在欧拉回路“这一条件构造出原图的欧拉回路进而求解答案。因此现在问题转化为如何构建出这样一张图出来。

首先一个非常直观的想法是对于每个区间新建一个左部点,对于数轴上每一个整点新建一个右部点,然后从每个区间表示的左部点向这段区间中所有整点表示的右部点连边,这样问题可以变为,对于每个右部点,与其相连的左部点中红点与蓝点的差的绝对值 \(\le 1\)​,不过注意到这样一来涉及与每个点相连的点 instead of 边,这是不好直接用欧拉回路求解的,因此我们必须迟早放弃这个想法(

不难发现,如果我们将所有染成红色的视作 \(+1\),染成蓝色视作 \(-1\),那么一个点符合 \(|r(x)-b(x)|\le 1\) 的要求当且仅当将所有覆盖它的所有线段权值之和为 \(-1,0\) 或 \(1\)。因此问题可以转化为,有 \(n\) 个区间,你要选择对于每一个区间,选择将区间中所有位置上的数 \(+1\) 或者 \(-1\),使得最终每个位置上的数的绝对值 \(\le 1\)。我们不妨先考虑一个弱化版,也就是所有点被覆盖次数恰好为偶数的情况,此时最终序列中每个数都应是 \(0\)。注意到这里涉及区间操作,而区间操作可以视作差分序列上的两个端点操作,也就是说对于一个区间 \([l,r]\),我们可以看作,你可以选择令 \(b_l\) 加 \(1\),\(b_{r+1}\) 减 \(1\),或者令 \(b_l\) 减 \(1\),\(b_{r+1}\) 加 \(1\),最后要使 \(b\) 序列每个元素都是 \(0\)。我们考虑从 \(l\) 向 \(r+1\) 连一条边,这样如果我们选择 \((l,r+1)\) 这条边从 \(l\) 指向 \(r+1\) 则会使 \(l\) 出度 \(+1\),\(r+1\) 入度 \(+1\),反之会使 \(l\) 入度 \(+1\),\(r+1\) 出度 \(+1\),这样最终序列 \(b\) 中所有元素都为 \(0\) 就自然地被转化为,每个点入度都等于出度,这样就自然地可以欧拉回路了。跑一遍欧拉回路,然后如果 \((l_i,r_i+1)\) 这条边由 \(l_i\) 指向 \(r_i+1\) 则令 \(i\) 的颜色为 \(0\),否则令 \(i\) 的颜色为 \(1\)。那么如果有的点覆盖次数不是偶数怎么办呢?如果 \(i\) 覆盖次数为奇数,那我们就手动添加一个区间 \([i,i]\),这样所有点覆盖次数都是偶数,就可以规约为前一种情况了。

注意,由于区间长度很大,需要离散化。具体来说按照 P3643 [APIO2016]划艇 的套路,将所有区间改写成一个左闭右开的区间,然后离散化一下即可将整个数轴拆成 \(\mathcal O(n)\) 个左闭右开的区间,那么显然每一个左闭右开的区间中所有点最终的权值都是一样的,因此我们只用取这个区间最左边的点作为该区间的代表点即可。

时间复杂度 \(\mathcal O(n\log n)\),因为要离散化。

const int MAXN=1e5;
int n,l[MAXN+5],r[MAXN+5],key[MAXN*2+5],cnt=0,uni[MAXN*2+5],num=0;
int d[MAXN*2+5],hd[MAXN*2+5],nxt[MAXN*6+5],to[MAXN*6+5],ec=1;
void adde(int u,int v){/*printf("adde %d %d\n",u,v);*/to[++ec]=v;nxt[ec]=hd[u];hd[u]=ec;}
int dir[MAXN*3+5],vis[MAXN*2+5],now[MAXN*2+5];
void dfs(int x){
// printf("dfs %d\n",x);
vis[x]=1;
for(int &e=now[x];e;e=nxt[e]) if(!~dir[e>>1]){
dir[e>>1]=e&1;dfs(to[e]);
}
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d%d",&l[i],&r[i]);++r[i];
key[++cnt]=l[i];key[++cnt]=r[i];
} sort(key+1,key+cnt+1);key[0]=-1;
for(int i=1;i<=cnt;i++) if(key[i]^key[i-1]) uni[++num]=key[i];
for(int i=1;i<=n;i++){
l[i]=lower_bound(uni+1,uni+num+1,l[i])-uni;
r[i]=lower_bound(uni+1,uni+num+1,r[i])-uni;
d[l[i]]++;d[r[i]]--;adde(l[i],r[i]);adde(r[i],l[i]);
}
for(int i=1;i<=num;i++){
d[i]+=d[i-1];
if(d[i]&1) adde(i,i+1),adde(i+1,i);
}
memset(dir,-1,sizeof(dir));
for(int i=1;i<=num;i++) now[i]=hd[i];
for(int i=1;i<=num;i++) if(!vis[i]) dfs(i);
for(int i=1;i<=n;i++) printf("%d%c",dir[i]," \n"[i==n]);
return 0;
}

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

  1. Codeforces 429E Points and Segments

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

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

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

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

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

  4. codeforces 430A Points and Segments (easy)(理解能力有待提高……)

    题目 //终于看懂题目了,,,, //一条线段里面不是每个坐标上都有要染色的点,所以为了满足条件,只能考虑那些给出坐标的点 //所以就要排序一下了,不能直接根据坐标0 1 0 1…… #include ...

  5. CodeForces 430A Points and Segments (easy)(构造)题解

    题意:之前愣是没看懂题意...就是给你n个点的坐标xi,然后还规定了Li,Ri,要求给每个点染色,每一组L,R内的点红色和黑色的个数不能相差大于1个,问你能不能染成功,不能输出-1,能就按照输入的顺序 ...

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

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

  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. 【CF429E】 Points and Segments(欧拉回路)

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

  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. Android系统编程入门系列之应用权限的定义与申请

    在之前关于应用内数据本地保存为文件时,曾提到应用需要申请外部存储设备的读写权限才能访问外部存储中的文件.那么针对某一种权限,应用程序具体应该怎么申请使用呢?本文将详细介绍. 应用中的权限主要分为两类, ...

  2. 【UE4 C++ 基础知识】<10>资源的引用

    2种引用方式 硬引用(Hard Reference) 即对象 A 引用对象 B,并导致对象 B 在对象 A 加载时加载 硬引用过多会导致运行时很多暂时用不到的资源也被加载到内存中 大量资源会导致进程阻 ...

  3. Scrum Meeting 0531

    零.说明 日期:2021-5-31 任务:简要汇报两日内已完成任务,计划后两日完成任务 一.进度情况 组员 负责 两日内已完成的任务 后两日计划完成的任务 困难 qsy PM&前端 完成后端管 ...

  4. seata序列化日期类型出错

    一.背景 最近在整合seata的过程中,发现如果业务表中存在 datetime 的数据类型,那么在分布式事务中,修改这个字段的值时,会出现如下错误.此处提供2种解决方案. com.fasterxml. ...

  5. eureka服务端的高可用

    eureka client的高可用这个很简单,只需要向eureka服务端上多注册几个实例即可,那么eureka server端如何实现高可用呢?其实eureka server 端也是可以做为一个客户端 ...

  6. csp-s 2021

    T1 廊桥分配 当一架飞机抵达机场时,可以停靠在航站楼旁的廊桥,也可以停靠在位于机场边缘的远机位. 乘客一般更期待停靠在廊桥,因为这样省去了坐摆渡车前往航站楼的周折. 然而,因为廊桥的数量有限,所以这 ...

  7. 对dy和Δy的浅薄理解

    一.导数定义 当函数y=f(x)的自变量x在一点x0上产生一个增量Δx时,函数输出值的增量Δy与自变量增量Δx的比值在Δx趋于0时的极限a如果存在,a即为在x0处的导数,记作f'(x0)或df(x0) ...

  8. 第K个数 牛客网 程序员面试金典 C++ Python

    第K个数 牛客网 程序员面试金典 C++ Python 题目描述 有一些数的素因子只有3.5.7,请设计一个算法,找出其中的第k个数. 给定一个数int k,请返回第k个数.保证k小于等于100. 测 ...

  9. Python import Queue ImportError: No module named 'Queue'

    python3 中引入Queue 会报出这个问题 python3 中这样引入 import queue python2 中这样引入 import Queue 为了兼容 可以这样 import sys ...

  10. si macro macro

    获取 buf 里的 symbol cbuf = BufListCount() msg(cbuf) ibuf = 0 while (ibuf < cbuf) { hbuf = BufListIte ...