ARC119C ARC Wrecker 2 题解
link T1です
定义“编辑”为选择数组中相邻的两个数同加或同减。
给定一个长度为 的数组 ,你想统计有多少个 的子序列满足可以通过若干次“编辑”,途中所有值在任意时刻不能为负,最终子序列内所有元素均为 。
(注意是子序列,即你不能一个数在外面一个数在里面来单点修改子序列)
先不考虑同加。考虑什么样的情况是可以的。
一个很直接的想法是从左往右消,如果说有某个值与后面产生了脱离,这样就是不可以的。
比如说
1 | |
先把 消掉 ,此时变为 0 1 13 3 5,
把 消掉 ,此时变为 0 0 12 3 5,
最后把 消掉 ,此时变为 0 0 9 0 5,而这个 是无法与后面接壤的。
我们考虑怎么样维护这个东西。
可以发现,在 消去之后,。这相当于一个全局的 和 操作。
那么我们就可以使用一个 multiset 维护这个东西。
扫一遍整个数组。边扫边将新的初始值添加进去。
一旦出现负数,就说明了出现了无法接壤的情况。比如 12 3 会强制算为 0 -9 。只需要 lower_bound 一下分界点舍弃掉这种情况即可。
如果要统计答案,直接使用 count(a[i+1]) 即可。即最后两个相同的可以直接消去,这是合法的情况。
那么我们现在考虑同加。
还是以 0 0 9 0 5 为例。我们可以将 0 5 加上 ,这样子就可以使得 9 9 消掉了,留下一个 14。
这种情况怎么表示呢?原来的值是 (0 0) 12 3 5
给 0 5 加上 事实上是给 加 变成 。
由于 ,因此 ,与之前的 并无区别。
因此在有了同加后就不需要考虑无法接壤的情况了。还更简单了呢。
小细节:multiset.count() 的复杂度为 count 的数量。建议使用 map 或 umap。
代码:
1 | |
ARC119C ARC Wrecker 2 题解
https://formu1-github.github.io/Hexo-blog/2025/10/21/ARC119C-ARC-Wrecker-2-题解/