题目地址:
https://www.acwing.com/problem/content/description/4865/
某公司养有观赏花,这些花十分娇贵,每天都需要且仅需要浇水一次。如果某一天没给花浇水或者给花浇水超过一次,花就会在那一天死亡。公司即将迎来 n n n天假期,编号 1 ∼ n 1∼n 1∼n。为了让花能够活过整个假期,公司领导安排了 m m m个人(编号 1 ∼ m 1∼m 1∼m)来公司浇花,其中第 i i i个人在第 [ a i , b i ] [a_i,b_i] [ai,bi]天每天来公司浇一次花。领导是按照时间顺序安排的浇花任务,保证了对于 1 ≤ i ≤ m − 1 1≤i≤m−1 1≤i≤m−1,均满足: b i ≤ a i + 1 b_i≤a_{i+1} bi≤ai+1。给定领导的具体安排,请你判断,花能否活过整个假期,如果不能,请你输出它是在第几天死的,以及那一天的具体浇水次数。
输入格式:
第一行包含两个整数
n
,
m
n,m
n,m。
接下来
m
m
m行,每行包含两个整数
a
i
,
b
i
a_i,b_i
ai,bi。
输出格式:
输出一行结果。
如果花能活过整个假期,则输出OK
。
如果花不能活过整个假期,则输出两个整数
x
,
y
x,y
x,y,表示花是在第
x
x
x天死的,这一天花被浇了
y
y
y次水。
数据范围:
前
4
4
4个测试点满足
1
≤
n
,
m
≤
10
1≤n,m≤10
1≤n,m≤10。
所有测试点满足
1
≤
n
,
m
≤
1
0
5
1≤n,m≤10^5
1≤n,m≤105,
1
≤
a
i
≤
b
i
≤
n
1≤a_i≤b_i≤n
1≤ai≤bi≤n。
浇花可以视为对一个区间每个数加 1 1 1,于是可以用差分来做。代码如下:
#include <iostream>
using namespace std;
const int N = 1e5 + 10;
int n, m;
int b[N];
int main() {
scanf("%d%d", &n, &m);
while (m--) {
int l, r;
scanf("%d%d", &l, &r);
b[l]++;
b[r + 1]--;
}
for (int i = 1; i <= n; i++) {
b[i] = b[i] + b[i - 1];
if (b[i] != 1) {
printf("%d %d\n", i, b[i]);
return 0;
}
}
puts("OK");
}
时间复杂度 O ( m + n ) O(m+n) O(m+n),空间 O ( n ) O(n) O(n)。