检测到 KaTeX 加载失败,可能会导致文中的数学公式无法正常渲染。
#题面
#题目描述
Utsuho 有 条线段,现在她希望在其中找到两条有公共点的线段,使得它们的异或值最大。
定义线段异或值为它们并的长度减它们交的长度。
#输入格式
输入的第一行包括一个正整数 ,表示 Utsuho 的线段的个数。
接下来 行每行包括两个正整数 ,表示 Utsuho 拥有的线段的左右端点。
#输出格式
输出一行一个整数,表示能得到的最大异或值。
#输入输出样例
样例输入 #1
3
10 100
1 50
50 100
样例输出 #1
99
样例解释 #1
- 选择第一条和第二条:;
- 选择第一条和第三条:;
- 选择第二条和第三条:。
样例输入 #2
3
1 100
180 200
190 210
样例输出 2
20
#数据规模与约定
- 对于 的数据,满足 ;
- 对于 的数据,满足 ;
- 另有 的数据,满足 ;
- 对于 的数据,满足 ,。
#思路
算是个优化版的暴力。考场上的思路不是特别清晰,所以前前后后一共搞了一个多小时。这个做法的不如正解的简单明了,但是跑的比正解快,内存占用还比正解小。
同一直线上的两条线段存在一下几种关系:
- 包含,两者的异或值为 ;
- 相交,两者的异或值为 ;
- 相离,此时对最大异或值没有贡献,忽略即可。
接下来可以分类讨论:
- 对于包含的情况,可以枚举线段 2,然后使用堆维护前面所有线段中长度最长的线段作为线段 1。
- 对于相交的情况,上方的计算异或值的式子可以改写为 ,那么可以枚举线段 2,并使用堆维护 值最大的线段 1。
可以使用优先队列模拟堆,省去了手写的麻烦。
#代码
1 |
|