1 条题解

  • 0
    @ 2025-10-17 19:36:42

    题意理解 我们有一个长度为 nn 的序列 a1,a2,,ana_1, a_2, \dots, a_n,表示 nn 个居民各自最喜欢的菜。Manlar 可以选择任意区间 [l,r][l, r] 邀请居民,并准备该区间内出现次数最多的菜。他获胜的条件是:投给他的票数(即最喜欢这道菜的居民数)严格大于区间长度的一半。

    换句话说,我们需要统计所有满足以下条件的区间 [l,r][l, r]:区间内存在某个菜 xx,使得 xx 的出现次数 >rl+12> \frac{r-l+1}{2}

    核心思路

    1.关键转化 对于每个可能的菜 xx,我们单独考虑:

    构造新序列 bb

    如果 ai=xa_i = x,则 bi=1b_i = 1

    如果 aixa_i \neq x,则 bi=1b_i = -1

    计算前缀和 sss0=0s_0 = 0si=si1+bis_i = s_{i-1} + b_i1in1 \le i \le n

    重要性质:区间 [l,r][l, r]xx 为绝对众数当且仅当 sr>sl1s_r > s_{l-1}

    证明:区间和 $s_r - s_{l-1} = cnt_x \times 1 + (len - cnt_x) \times (-1) = 2cnt_x - len$,其中 len=rl+1len = r-l+1。这个值大于 00 等价于 cntx>len/2cnt_x > len/2

    2.问题转化 对于固定的菜 xx,我们需要统计满足 0l1<rn0 \le l-1 < r \le nsl1<srs_{l-1} < s_r(l,r)(l, r) 对数。

    这等价于计算前缀和数组 s[0n]s[0 \dots n] 的正序对数量(即 i<ji < jsi<sjs_i < s_j(i,j)(i, j) 对数)。

    算法步骤 预处理:找出序列中所有不同的菜品种类

    对每个候选菜 xx

    构造对应的前缀和数组 ss

    用分治法(类似归并排序)统计 ss 数组的正序对数量

    累加结果:将所有候选菜对应的正序对数量相加,得到最终答案

    复杂度分析

    时间复杂度O(nlogn)O(n \log n)。虽然我们对每个不同的菜都进行了一次分治计算,但由于每个位置只在对应的菜计算中被设为 +1+1,在其他计算中都是 1-1,所以总体复杂度保持在 O(nlogn)O(n \log n)

    空间复杂度O(n)O(n),主要用于存储前缀和数组和临时数组。

    • 1

    信息

    ID
    3122
    时间
    1000ms
    内存
    256MiB
    难度
    9
    标签
    递交数
    7
    已通过
    1
    上传者