loj 3039

NKOJ

Description

\(n\)个蛋糕,每个蛋糕有\(w_i,h_i\)。选\(m\)个蛋糕满足\(\sum\limits_{j=1}^mw_{k_j}-\sum\limits_{j=1}^m|h_{k_j}-h_{k_{j+1}}\ |\)

因为蛋糕摆成一个环所以\(k_1=k_{m+1}\)

Solution

我因为最近天天做dp,直接就往dp上想的,其实是思维僵化。

然后本来可以骗46分的,因为没有考虑到答案可能是负数+数据点捆绑直接宝菱。

dp就前缀和优化dp就可以做了,很好写。

当然前面肯定要想到\(\sum\limits_{j=1}^m|h_{k_j}-h_{k_{j+1}}\ |\)这个的最小值,显然是按\(h\)从小到大排后得到的,因此其实是\(2*(maxh-minh)\)

这样按\(h\)排序,消除影响。

枚举最后一个选的点\(i\),发现第一个选的点\(j\)是具有决策单调性的(只会打表)

整体二分+可删对顶堆

这东西挺恶心的,总之我调了好久,经常推翻重来

总结一下:

整体二分:维护两个指针\(tl\),\(tr\),复杂度是\(nlog_2^2n\)的因为\(log_2n\)层,每次\([L,R]\)结束时,\(tl=L,tr=R\)。左递归开始时肯定是取\([L,R]\)中一个点\(pos\),\(tl=pos,tr=pos\),左边递归结束时一定是也\(tl=pos,tr=pos\)(左dfs树最靠右的叶子),此时再右递归转移到 \(tl=R,tr=R\)。考虑这一层的转移,显然是\(R-L+1\)次,每次\(O(log_2n)\),而又有有\(log_2n\)层。

当然上面的复杂度证明中,不一定是确切的等于(如 \(tl\) 会有和 \(mid-m+1\) 取 \(min\),每层跟\(mid\)有关总体也是\(nlog_2n\)级别的),易证影响不大/kk。

对顶堆:因为你需要维护前\(m\)大的和(\(sumw\)),如果你只存一个大根堆,删除或者加入是维护不了的。

因此前\(m\)大的数存入小根堆\(Q1\)里,其它小的数存入大根堆\(Q2\),每次加入一个数判断如果大于\(Q1\),\(Q2\)分界,把\(Q1.top()\)加入\(Q2\),把该数加入\(Q1\)。否则直接加入\(Q2\)

然后删除也维护两个可删堆\(D1,D2\)。每次删除的时候判断删的数是在\(Q1\)中则加入\(Q2\),反之……

每次取出堆顶前判断是如果已经在可删堆内,直接删了(这是可删堆的常规操作……)

!!! 这里我犯过一个错误

你维护的\(sumw\)不是你\(Q1\)里面实际所有值的和。而是里面没有在\(D1\)中(没被删)的和。

即\(Q1-D1\)才是真正的前\(m\)大。\(Q1\)里面还存在着一些已经死去的傀儡……

所以实际上\(Q1.size()\)不一定等于\(m\),我们需要单独维护一个\(sz1\)(这个很简单)

实现细节:不知道我的实现方式会不会比别人复杂

强制\(Q1\),\(Q2\)的堆顶是存在的(没被删),需要每次\(pop()\)后,删点即可。

Add的就是上面对顶堆说的那堆。

Del比较复杂,如果删除的是在\(Q1\)中的,用\(Q2.top()\)替代删除的那个,即把\(Q2.top()\)加入\(Q1\),删除的值加入\(D1\)。这样也保证了\(sz1\)守恒。

以后写博客尽量宏观一点,不要太啰嗦,不过我感觉题目都好细节呀。

「JOISC 2019 Day4」蛋糕拼接 3的更多相关文章

  1. @loj - 3039@ 「JOISC 2019 Day4」蛋糕拼接 3

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 今天是 IOI 酱的生日,所以她的哥哥 JOI 君给她预定了一个 ...

  2. 「JOISC 2019 Day3」穿越时空 Bitaro

    「JOISC 2019 Day3」穿越时空 Bitaro 题解: ​ 不会处理时间流逝,我去看了一眼题解的图,最重要的转换就是把(X,Y)改成(X,Y-X)这样就不会斜着走了. ​ 问题变成二维平面上 ...

  3. 【LOJ】#3036. 「JOISC 2019 Day3」指定城市

    LOJ#3036. 「JOISC 2019 Day3」指定城市 一个点的可以dp出来 两个点也可以dp出来 后面的就是在两个点的情况下选一条最长的链加进去,用线段树维护即可 #include < ...

  4. 【LOJ】#3034. 「JOISC 2019 Day2」两道料理

    LOJ#3034. 「JOISC 2019 Day2」两道料理 找出最大的\(y_{i}\)使得\(sumA_{i} + sumB_{y_i} \leq S_{i}\) 和最大的\(x_{j}\)使得 ...

  5. 【LOJ】#3032. 「JOISC 2019 Day1」馕

    LOJ#3032. 「JOISC 2019 Day1」馕 处理出每个人把馕切成N段,每一段快乐度相同,我们选择第一个排在最前的人分给他的第一段,然后再在未选取的的人中选一个第二个排在最前的切一下,并把 ...

  6. 【LOJ】#3033. 「JOISC 2019 Day2」两个天线

    LOJ#3033. 「JOISC 2019 Day2」两个天线 用后面的天线更新前面的天线,线段树上存历史版本的最大值 也就是线段树需要维护历史版本的最大值,后面的天线的标记中最大的那个和最小的那个, ...

  7. 【LOJ】#3031. 「JOISC 2019 Day1」聚会

    LOJ#3031. 「JOISC 2019 Day1」聚会 听说随机可过? 我想了很久想了一个不会被卡的做法,建出前\(u - 1\)个点的虚树,然后找第\(u\)个点的插入位置,就是每次找一条最长链 ...

  8. 【LOJ】#3030. 「JOISC 2019 Day1」考试

    LOJ#3030. 「JOISC 2019 Day1」考试 看起来求一个奇怪图形(两条和坐标轴平行的线被切掉了一个角)内包括的点个数 too naive! 首先熟练的转化求不被这个图形包含的个数 -- ...

  9. LOJ#2882. 「JOISC 2014 Day4」两个人的星座(计算几何)

    题面 传送门 题解 我们发现如果两个三角形相离,那么这两个三角形一定存在两条公切线 那么我们可以\(O(n^2)\)枚举其中一条公切线,然后可以暴力\(O(n^3)\)计算 怎么优化呢?我们可以枚举一 ...

随机推荐

  1. 前端面试题整理——普通函数和new函数

    下列代码的输出值: function A() { console.log(1) } function fn() { A = function () { console.log(2) } return ...

  2. DRF 视图组件

    目录 DRF 视图组件 视图组件大纲 两个视图基本类 五个扩展类 九个子类视图 视图集 常用视图集父类 魔法类 一览表 DRF中视图的"七十二变" 第一层:基于APIview的五个 ...

  3. 【weex开发】环境配置流程

    1,安装node.js node官网下载,然后安装即可. 安装完成以后可以查看node和npm版本 $ node -v v6.11.3 $ npm -v 3.10.10 2,安装weex-toolki ...

  4. Idea导出jar包和使用自定义API

    自定义jar简单实现案例 学习内容 1. 自定义工具类 2. 导出jar 3. 加载Jar包 4. 调用自定义的API方法 总结 学习内容 1. 自定义工具类 新建一个java项目,然后创建包和工具类 ...

  5. JS判断数组中的对象的每一个值不能为空

    方法一:使用every()函数,此函数不怎么常用,想要了解更多请自查 //表格 evaluateData为表格的数据 <el-table id="out-table3" :d ...

  6. python数据类型与基础运算

    注释:了解其他数据类型补充 基础数据类型补充 可以回一下之前的数据类型: 整型,浮点型,字串符和列表. 一.字典(dict) #字典:可以精准的储存数据 是用大括号表示'{}' '字典和数据数据列表差 ...

  7. SpringCloud分布式尝试记录

    服务提供端: 客户消费端:

  8. CF problem: (D) Maximum Product Strikes Back

    Problem - D - Codeforces Example input 5 4 1 2 -1 2 3 1 1 -2 5 2 0 -2 2 -1 3 -2 -1 -1 3 -1 -2 -2 out ...

  9. 生成二维码,并且保存,指定位置的view成图片,并且保存到本地相册

    效果图: 保存的图片效果是: 保存到本地的,是整个视图,不只是单单的二维码的图片, 在了解的一番过程之后,我知道了, 1.首先要去获取保存图片的写入权限:(使用 https://github.com/ ...

  10. 11.Flink实时项目之支付宽表

    支付宽表 支付宽表的目的,最主要的原因是支付表没有到订单明细,支付金额没有细分到商品上, 没有办法统计商品级的支付状况. 所以本次宽表的核心就是要把支付表的信息与订单明细关联上. 解决方案有两个 一个 ...