Loading

ABC408C 翻译+题解

题面汉化

问题陈述

在 AtCoder 王国中,有 \(N\) 座城墙,编号从 \(1\)\(N\)。此外,还有 \(M\) 座炮塔。

\(i\) 座炮塔守卫编号从 \(L_i\)\(R_i\) 的城墙。

当某座炮塔被摧毁时,它原本守卫的城墙将不再受到该炮塔的守卫。

请计算,最少需要摧毁多少座炮塔,才能使得至少有一座城墙没有被任何炮塔守卫

限制条件

  • \(1 \leq N \leq 10^6\)
  • \(1 \leq M \leq 2 \times 10^5\)
  • \(1 \leq L_i \leq R_i \leq N\)\(1 \leq i \leq M\)
  • 所有输入值均为整数。

输入格式

输入由标准输入提供,格式如下:

\(N\) \(M\)
\(L_1\) \(R_1\)
\(L_2\) \(R_2\)
$ \vdots \( \)L_M$ \(R_M\)

输出格式

输出一个整数,表示最少需要摧毁的炮塔数量,使得至少有一座城墙没有被任何炮塔守卫。


题解

题意

\(m\) 个炮台守护 \(n\) 个城墙,第 \(i\) 个炮台的守护范围是 \([l_i, r_i]\) 。设城墙 \(i\)\(c_i\) 个炮台覆盖,输出:

\[\underset{1 \le i \le N}{\min} c_i \]

思路

第一想法通过 \((l,r)\) 维护 \(c\),最后遍历 \(c\) 输出最小值。但如果暴力维护 \(c\),复杂度是 \(O(MN) = 2 \times 10^{11}\),会超时。此时引入差分数组将维护操作优化为 \(O(1)\),可以把复杂度优化为 \(O(M)\)

最终解:遍历每组 \((l,r)\) 维护差分数组 \(d\),通过 \(d\) 求出 \(c\)。最后遍历 \(c\) 输出最小值。

最终代码

posted @ 2025-06-06 14:30  BaguetteShimada  阅读(18)  评论(0)    收藏  举报