1 条题解
-
0
题意理解 我们有一个长度为 的序列 ,表示 个居民各自最喜欢的菜。Manlar 可以选择任意区间 邀请居民,并准备该区间内出现次数最多的菜。他获胜的条件是:投给他的票数(即最喜欢这道菜的居民数)严格大于区间长度的一半。
换句话说,我们需要统计所有满足以下条件的区间 :区间内存在某个菜 ,使得 的出现次数 。
核心思路
1.关键转化 对于每个可能的菜 ,我们单独考虑:
构造新序列 :
如果 ,则
如果 ,则
计算前缀和 :,()
重要性质:区间 以 为绝对众数当且仅当 。
证明:区间和 $s_r - s_{l-1} = cnt_x \times 1 + (len - cnt_x) \times (-1) = 2cnt_x - len$,其中 。这个值大于 等价于 。
2.问题转化 对于固定的菜 ,我们需要统计满足 且 的 对数。
这等价于计算前缀和数组 的正序对数量(即 且 的 对数)。
算法步骤 预处理:找出序列中所有不同的菜品种类
对每个候选菜 :
构造对应的前缀和数组
用分治法(类似归并排序)统计 数组的正序对数量
累加结果:将所有候选菜对应的正序对数量相加,得到最终答案
复杂度分析
时间复杂度:。虽然我们对每个不同的菜都进行了一次分治计算,但由于每个位置只在对应的菜计算中被设为 ,在其他计算中都是 ,所以总体复杂度保持在 。
空间复杂度:,主要用于存储前缀和数组和临时数组。
- 1
信息
- ID
- 3122
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- 递交数
- 7
- 已通过
- 1
- 上传者