题目:选区间
给定 n 个一类区间 (l1, i, r1, i)。
给定 m 个二类区间 (l2, i, r2, i) 。
请你从一类区间中挑选一个区间,从二类区间中挑选一个区间。
要求,选出的两个区间之间的距离尽可能大。
请你输出最大可能距离。
关于两区间 (l1,r1)和 (l2,r2) 之间的距离,我们规定:
- 如果两区间存在交集,则区间距离为 00。
- 如果两区间不存在交集,则区间距离为 |i − j| 的最小可能值,
- 其中 l1 ≤ i ≤ r1, l2 ≤ j ≤ r2l。
输入格式
第一行包含一个整数 n。
接下来 n 行,每行包含两个整数 l1, i, r1, i。
再一行包含一个整数 m。
最后 m 行输出,每行包含两个整数 l2, i, r2, i。
输出格式:
一个整数,表示最大可能距离
数据范围:
前三个测试点满足 1≤n, m≤101≤n, m≤10。
所有测试点满足 1≤n, m≤2×1051≤n, m≤2×105,1≤l1, i≤r1, i≤1091≤l1, i≤r1, i≤109,1≤l2, i≤r2, i≤1091≤l2, i≤r2, i≤109。
输入样例1:
3 1 5 2 6 2 3 2 2 4 6 8
输出样例1:
3
输入样例2:
3 1 5 2 6 3 7 2 2 4 1 4
输出样例2:
0
思想:
思想:先判断有无交集:b的两边界之一在a区间内,或a的两边界在b区间内
若有交集,区间距离为0
若无交集,计算出第一部分的右边界与第二部分的左边界的区间距离,求出所有情况里的最大值实现:一边输入,一边找出第一类中每个区间的最大左边界,和最小右边界
再 遍历二区间 时将 一的最大左边界与二中的右边界、 一中的最小右边界与二中的左边界 依次进行比较
代码:
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int INF = 1e9;
int main()
{
int n, m;
scanf("%d", &n);
int a = INF, b = -INF;
while (n--)
{
int l, r;
scanf("%d%d", &l, &r);
a = min(a, r);//一类区间里的最小的右边界
b = max(b, l);//一类区间里的最大的左边界
}
scanf("%d", &m);
int res = 0;
while (m--)
{
int l, r;
scanf("%d%d", &l, &r);
if (a < l)//一类区间在二类区间前面
res = max(res, l - a);
if (b > r)//二类区间在一类区间前面
res = max(res, b - r);
}
printf("%d\n", res);//res为距离最大值
return 0;
}