题目地址:
https://www.luogu.com.cn/problem/P2082
题目描述:
已知有
N
N
N个区间,每个区间的范围是
[
s
i
,
t
i
]
[s_i,t_i]
[si,ti],请求出区间覆盖后的总长。
输入格式:
N
s1 t1
s2 t2
……
sn tn
输出格式:
共一行,一个正整数,为覆盖后的区间总长。
数据范围:
对于
40
%
40\%
40%的数据
N
≤
1000
,
0
<
S
i
<
T
i
≤
10000
N≤1000,0<S_i<T_i≤10000
N≤1000,0<Si<Ti≤10000
对于
100
%
100\%
100%的数据
N
≤
1
0
5
,
0
<
S
i
<
T
i
≤
1
0
1
7
N≤10^5, 0<S_i<T_i≤10^17
N≤105,0<Si<Ti≤1017,且为整数
先将所有区间按左端点排序,然后遍历区间,维护一个右边界,看每次新考虑一个区间会增加多少覆盖范围,累加即可。代码如下:
#include <iostream>
#include <algorithm>
#define x first
#define y second
using namespace std;
using PLL = pair<long, long>;
const int N = 1e5 + 10;
int n;
PLL a[N];
int main() {
scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf("%ld%ld", &a[i].x, &a[i].y);
sort(a, a + n);
long res = 0, r = -1e19;
for (int i = 0; i < n; i++)
if (r <= a[i].y) {
res += a[i].y - max(r, a[i].x) + 1;
r = a[i].y + 1;
}
printf("%ld\n", res);
}
时间复杂度 O ( n log n ) O(n\log n) O(nlogn),空间 O ( 1 ) O(1) O(1)。