【ACWing】4862. 浇花

题目地址:

https://www.acwing.com/problem/content/description/4865/

某公司养有观赏花,这些花十分娇贵,每天都需要且仅需要浇水一次。如果某一天没给花浇水或者给花浇水超过一次,花就会在那一天死亡。公司即将迎来 n n n天假期,编号 1 ∼ n 1∼n 1n。为了让花能够活过整个假期,公司领导安排了 m m m个人(编号 1 ∼ m 1∼m 1m)来公司浇花,其中第 i i i个人在第 [ a i , b i ] [a_i,b_i] [ai,bi]天每天来公司浇一次花。领导是按照时间顺序安排的浇花任务,保证了对于 1 ≤ i ≤ m − 1 1≤i≤m−1 1im1,均满足: b i ≤ a i + 1 b_i≤a_{i+1} biai+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 1n,m10
所有测试点满足 1 ≤ n , m ≤ 1 0 5 1≤n,m≤10^5 1n,m105 1 ≤ a i ≤ b i ≤ n 1≤a_i≤b_i≤n 1aibin

浇花可以视为对一个区间每个数加 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)

  • 18
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值