1 条题解

  • 0
    @ 2025-8-24 22:44:11

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar ღꦿ࿐
    一直游到海水变蓝

    搬运于2025-08-24 22:44:11,当前版本为作者最后更新于2023-01-30 09:08:36,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    看到这个题的题解都很简略,所以我写详细点。

    首先这个 popcount\operatorname{popcount} 函数的势能性质是不好分析的,因为 apa\geq ppopcount(a)\operatorname{popcount}(a) 不一定大于 popcount(b)\operatorname{popcount}(b), 所以只能考虑 popcount\operatorname{popcount} 的值域为 O(logV)O(\log V) 的性质,

    线段树维护,将操作分为若干线段,接下来如果某个段在某个时刻被求过一次 popcount\operatorname{popcount},后面无论再怎么整段地加,它的值都可以表示成 popcount()+b\operatorname{popcount}( \dots) + b 的形式,所以我们考虑在线段树上维护标记:

    f(popcount(x+a))+bf(\operatorname{popcount}(x+a))+b,其中 f(x)f(x) 是一个 值域和定义域均为 O(logV)O(\log V) 的函数,这样做的原因如下:

    我们把操作序列形象地描述出来,加法是 a\texttt a,区间做 popcount\operatorname{popcount}p\texttt p,那么操作序列例如

    apapppaaapaaa\texttt{apapppaaapaaa}

    我们把加法合并成一次再按照 pp 分段:

     ap| ap | ap | ap | ap | a\texttt{ ap| ap | ap | ap | ap | a}

    就变成了若干次 popcount(x+b)\operatorname{popcount}(x+b) 的复合,这就是一个值域 O(logV)O(\log V) 的函数,从第二次开始定义域也变成了 O(logV)O(\log V),于是我们直接维护第一步函数的样子,暴力维护第二步开始以及后面函数的复合,单独计算最后的加法就可以做到了。

    纯加法需要单独记录,它的值域不同。复合时也需要特判。

    时间复杂度 O(qlognlogV)O(q\log n\log V) ,可以跑进 4s,做一些卡常性质的处理(如对于区间长度小于 3logV3\log V 的区间,再次下传标记是不优秀的,不如暴力)即可跑进 2s,目前最优解第二。

    • 1

    信息

    ID
    8298
    时间
    10000ms
    内存
    1024MiB
    难度
    6
    标签
    递交数
    0
    已通过
    0
    上传者