欢迎光临散文网 会员登陆 & 注册

P3370 [CTSC2017]密钥 题解

2022-10-04 17:51 作者:fdsji  | 我要投稿

先来考虑最简单的暴力做法:从 X 开始,一个一个枚举 A 和 B 的数量,对其进行判断,最后求解。  

考虑优化一下:将 A 当作 1B 当作 -1。进行加和后再去比较。  

继续优化,可以使用前缀和。


根据题目中对“强的”的定义,我们可以证明如下结论:  

 强的字母(A 或 B)一共有 k 个。


 证明:我们将 A 看作 1B 看作 -1。  

 那么整个序列的前缀和就是由 0 分割成的若干段区间组成的。并且这些区间一定全为同号(即一个区间内,要么全为正,要么全为负)。


因此,前面两个小问就可以通过我们刚刚所推得的结论转化成第三个小问。  

特别地,我们将 X 看作 -1,并令 s_i 为整个序列的前缀和。记原序列中 X 的位置为 x。  

考虑一个强的 B(其所在位置为 i)。  

若它在 X 后面,则满足 s_i%20-%20s_x%20%3C%200%20%5CRightarrow%20s_i%20%3C%20s_x  

否则,满足 (s_n%20-%20s_x)%2B%20s_i%20%3C%200%20%5CRightarrow%20s_i%20%5Cle%20s_x  

推广得到:若有 t 个强的 B,则一定存在 t 个 s_i 满足 s_i%20%3C%20s_x 或者 s_i%20%3D%20s_x%20%5Cbigwedge%20i%20%3C%20x

因此,对于每个 B 的位置,求出有序二元组 (s_i%2C%20i) 的第 t 小元素,就是最终的答案。


可以考虑计数排序(初赛刚搞过)。时间复杂度 O(n)

Code:


P3370 [CTSC2017]密钥 题解的评论 (共 条)

分享到微博请遵守国家法律