CF514D题解

题面

Description:
\(n\) 个敌人,每个敌人有 \(m\) 种属性值,第 \(i\) 个敌人的每个属性分别为 \(a_{i,1},a_{i,2},\ldots,a_{i,m}\)。你要构造一个长度为 \(m\) 的数列 \(b_{1\ldots m}\),规定敌人 \(i\) 被杀死当且仅当 \(a_{i,1}\leq b_1,a_{i,2}\leq b_2,\ldots,a_{i,m}\leq b_m\) 全部满足。

数列 \(b\) 要满足以下条件:

  1. \(\sum b_i\leq k\)
  2. 连续的被杀死的敌人数量最多。

\(1\leq n\leq 10^5,1\leq m\leq 5,1\leq k\leq 10^9\)


从第 \(l\) 到第 \(r\) 个敌人都被杀死的必要条件是 \(\max_{l\leq i\leq r}\{a_{i,m}\}\leq b_m\)。既然要做最大值,首先想到用 ST 表维护。
然后我要连续的人数最多,所以二分连续的人数。对于每个长度 \(x\),我枚举数列中所有长度为 \(x\) 的区间,看我能否杀死这个区间中所有的敌人。形式化的,对于区间 \([l,r]\),我能杀死该区间内所有敌人,当且仅当 $$\sum_{i=1}^m \max_{j=l}^r a_{j,i}\leq k$$
那明显通过 ST 表做这个东西的复杂度是 \(O(m)\) 的。算上二分的复杂度,总复杂度为 \(O(nm\log n)\),可以通过本题。

实现时注意最大长度为 \(0\) 时的输出方式。

代码

posted @ 2022-06-05 13:23  1358id  阅读(28)  评论(0编辑  收藏  举报