CF429E Points and Segments 题解

news/2024/10/1 11:38:37

题目链接

点击打开链接

题目解法

真难啊/yun

把区间染成红色看作区间 \(+1\),染成蓝色看作区间 \(-1\),要求是每个点上的数 \(\in \{-1,0,1\}\)
可以选择的数有 \(-1,1\) 不太好做,我们考虑将限制变成每个点上的数只能为 \(0\)
我们记经过点 \(x\) 的线段数量为 \(cnt_x\)
如果 \(cnt_x\) 是奇数,那么我们添一条线段 \([x,x]\),用来配平,这样就可以保证每个点上的数只能为 \(0\)

区间 \(+1/-1\) 仍然不太好做,我们考虑维护其差分数组
那么所有数都为 \(0\) 等价于 差分数组的所有数都为 \(0\)
二元关系考虑建图
我们把每条线段的 \(l_i, r_i+1\) 之间连边,现在的问题变成了给每条边定向,使得每个点出度 \(=\) 入度
这显然跑一遍欧拉回路即可

时间复杂度 \(O(n\log n)\),瓶颈在离散化

#include <bits/stdc++.h>
#define F(i,x,y) for(int i=(x);i<=(y);i++)
#define DF(i,x,y) for(int i=(x);i>=(y);i--)
#define ms(x,y) memset(x,y,sizeof(x))
#define SZ(x) (int)x.size()-1
#define all(x) x.begin(),x.end()
#define pb push_back
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
typedef pair<int,int> pii;
template<typename T> void chkmax(T &x,T y){ x=max(x,y);}
template<typename T> void chkmin(T &x,T y){ x=min(x,y);}
template<typename T> void read(T &FF){FF=0;int RR=1;char ch=getchar();for(;!isdigit(ch);ch=getchar()) if(ch=='-') RR=-1;for(;isdigit(ch);ch=getchar()) FF=(FF<<1)+(FF<<3)+ch-48;FF*=RR;
}
const int N=200010;
int n,l[N],r[N],dsc[N],s[N];
int e[3*N],ne[3*N],h[N],idx;
void add(int x,int y){ e[idx]=y,ne[idx]=h[x],h[x]=idx++;}
void add_edge(int x,int y){ add(x,y),add(y,x);}
bool vis[N],tag[3*N],col[3*N];
void dfs(int u){vis[u]=1;for(int &i=h[u];~i;){if(tag[i]){ i=ne[i];continue;}tag[i]=tag[i^1]=1,col[i]=1;dfs(e[i]);}
}
int main(){read(n);int cnt=0;F(i,1,n){read(l[i]),read(r[i]);dsc[++cnt]=l[i],dsc[++cnt]=r[i]+1;}sort(dsc+1,dsc+cnt+1);cnt=unique(dsc+1,dsc+cnt+1)-dsc-1;ms(h,-1);F(i,1,n){l[i]=lower_bound(dsc+1,dsc+cnt+1,l[i])-dsc;r[i]=lower_bound(dsc+1,dsc+cnt+1,r[i]+1)-dsc;add_edge(l[i],r[i]);s[l[i]]++,s[r[i]]--;}F(i,1,cnt) s[i]+=s[i-1];F(i,1,cnt) if(s[i]&1) add_edge(i,i+1);F(i,1,cnt) if(!vis[i]) dfs(i);F(i,0,n-1) if(col[i*2]) printf("0 ");else printf("1 ");puts("");return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/66760.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

七,MyBatis-Plus 扩展功能:乐观锁,代码生成器,执行SQL分析打印(实操详细使用)

七,MyBatis-Plus 扩展功能:乐观锁,代码生成器,执行SQL分析打印(实操详细使用) @目录七,MyBatis-Plus 扩展功能:乐观锁,代码生成器,执行SQL分析打印(实操详细使用)1. 乐观锁2. 代码生成器3. 执行SQL分析打印4. 总结:5. 最后: 1. 乐观锁 首先我们需要先了解开发中的…

加解密demo(java、php)

数据格式* @param args* 撞库---入参加密字段signs加密前格式** {* "mobileMask": "134123412**",* "city": "武汉",* "system": "qxh"* }** 撞库---返回加密字段signs加密前格式* {* "md5L…

Newstar Re wk1 wp

Newstar Re wk1 wpNewstar Re wk1 wp练一下markdown语法(有些地方明显是为了使用markdown语法而硬造的)begin 引导新手使用IDA Pro。用IDA Pro打开,根据英语引导可知flag分为三部分,依次寻找: 第一部分:点进&flag_part1,可找到第一部分。使用小端序存储所以要倒着…

《Java 基础篇》一:入门

Java 基础概念、运算符以及程序流程控制语句。Author: ACatSmiling Since: 2024-09-30bit 和 byte 计算机本质是一系列的电路开关。每个开关存在两种状态:开(on)和关(off)。如果电路是开的,它的值是 1,如果电路是关的,它的值是 0。一个 0 或者一个 1 存储为一个比特(b…

《Java 基础篇》二:面向对象

Java 面向对象的三条主线:类及类的成员、关键字和三大特征。Author: ACatSmiling Since: 2024-09-30概述 面向过程(POP)与面向对象(OOP):二者都是一种思想,面向对象是相对于面向过程而言的。面向过程,强调的是功能行为,以函数为最小单位,考虑怎么做。面向对象,将功能…

[python] 基于PyOD库实现数据异常检测

PyOD是一个全面且易于使用的Python库,专门用于检测多变量数据中的异常点或离群点。异常点是指那些与大多数数据点显著不同的数据,它们可能表示错误、噪声或潜在的有趣现象。无论是处理小规模项目还是大型数据集,PyOD提供了50多种算法以满足用户的需求。PyOD的特点包括:统一…

Linux 万字入门教程

Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。0. 前言文章已经收录到 GitHub 个人博客项目,欢迎 Star: https://github.com/chenyl8848/chenyl8848.github.io或者访问网站,进行在线浏览:…

Leetcode 611. 有效三角形的个数

1.题目基本信息 1.1.题目描述 给定一个包含非负整数的数组 nums ,返回其中可以组成三角形三条边的三元组个数。 1.2.题目地址 https://leetcode.cn/problems/valid-triangle-number/description/ 2.解题方法 2.1.解题思路 升序排列后,去两条边a和b,取b后面的第三条边c;a+c&…