zoukankan      html  css  js  c++  java
  • bzoj2006 [NOI2010]超级钢琴 (及其拓展)

    bzoj2006 [NOI2010]超级钢琴

    给定一个序列,求长度在 ([L, R]) 之间的区间和的前 (k) 大之和

    (nleq5 imes10^5, kleq2 imes10^5, |a_i|leq10^3)

    贪心,堆

    令状态 ((s, l, r)) 表示左端点为 (s) ,右端点在 ([l, r]) 中,使得区间和最大的右端点

    容易发现 (t=(s, l, r)) 即为前缀和在 ([l, r]) 中最大值的位置

    假设每次都选最优区间,显然像这样选 (k) 次就是最终答案

    假设当前最优状态为 ((s, l, r)) ,显然不能再取一遍 ([s, t]) ,但是其他决策可能会出现在 (t) 左右两端区间中

    因此将 ((s, l, t - 1))((s, t + 1, r)) 加入待选决策点即可

    这玩意儿可以用堆来维护

    时间复杂度 (O((n+k)log n))

    代码


    bzoj3689 异或之

    给定 (n) 个非负整数,求两两异或值前 (k) 小的数

    (nleq10^5, kleq2.5 imes10^5, a_iin[0, 2^{31}))

    贪心,堆,可持久化trie

    用上一题的方法解决

    令状态 (t=(s, l, r)) 表示左端点为 (s) ,右端点在 ([l, r]) 中,使得区间异或值最小的右端点

    现在只需考虑如何快速求出 (t)

    先前缀和一遍, (t=displaystylemax_{lleq ileq r}{sum_ioplus sum_{s-1}}) ,用可持久化trie,记一下每个“叶节点”的编号即可

    重题 bzoj5495 [2019省队联测]异或粽子 雾(

    时空复杂度 (O((n+k)log a_i))

    这种做法本身自带巨大常数,在bzoj卡了好一会儿常才卡过,洛谷上的只有去掉封装才能过……

    然而此题有常数更小的时间复杂度 (O((n+k)log a_i)) ,空间线性的做法,留坑待填……

    同时还有形似的(加强版?) CF241B Friends$CF1055F Tree and XOR 这玩意儿的时间复杂度与 (k) 无关……留坑待填……

    代码

  • 相关阅读:
    每日日报
    每日日报
    每日日报
    每日日报
    每日日报
    FM
    GBDT+LR
    推荐系统架构设计
    DSSM双塔模型
    git
  • 原文地址:https://www.cnblogs.com/Juanzhang/p/10691752.html
Copyright © 2011-2022 走看看