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. vue和mint-ui loadMore 实现上拉加载和下拉刷新

    首先安装mint-ui组件库 npm install mint-ui 在main.js中引入mint-ui和样式 import 'mint-ui/lib/style.css' import MintU ...

  2. vscode快速生成html的基本代码

    转载自:https://blog.csdn.net/suwyer/article/details/81237880 在vscode里新建html文件, 总是要一行一行的写标准的html代码: 而DW新 ...

  3. Java-GUI编程之事件处理

    事件处理 前面介绍了如何放置各种组件,从而得到了丰富多彩的图形界面,但这些界面还不能响应用户的任何操作.比如单击前面所有窗口右上角的"X"按钮,但窗口依然不会关闭.因为在 AWT ...

  4. Shiro之权限管理的概念

    文章目录 前言:什么是shiro 一.什么是权限管理? 举例 二.权限管理的具体分类 1.身份认证 2.授权 总结 前言:什么是shiro Apache Shiro 是一个开源安全框架,提供身份验证. ...

  5. 电机三环pid控制及调试经验

    一.伺服电机的双环pid 双环pid在正常底盘运动的控制中已经足够了,但是对于双轴云台的控制来说,双环pid的云台控制的响应速度是远远不够的,所以加入了电流环的控制. 两篇大佬的文章--这是我学习pi ...

  6. openfeign使用踩坑记录

    1.报ClassNotFound com.netflix.config.CachedDynamicIntProperty问题,原因是spring-cloud-starter-openfeign的spr ...

  7. 最强Postman替代品,国产软件Apifox到底有对牛?

    作为软件开发从业者,API 调试是必不可少的一项技能,在这方面 Postman 做的非常出色.但是在整个软件开发过程中,API 调试只是其中的一部分,还有很多事情 Postman 无法完成,或者无法高 ...

  8. 五、JDK的安装与配置

    一.JDK下载与安装 1.1.下载JDK安装包 博主在这里给大家准备了一个64位操作系统的jdk1.8以便大家下载(使用的是迅雷) 点击此处下载 提取码:dfbt 如果其他小伙伴的电脑版本不一样,博主 ...

  9. Java学习day14

    可变参数用作方法的形参,方法参数的个数就可变 格式:修饰符 返回值类型 方法名(数据类型...变量名){ } 方法内的形参只能有一个,这里的变量是一个数组 public static <T> ...

  10. java 竞赛常用方法

    一,基本数据类型 1.int,float.double等转换为字符串用 String.valueOf方法 eg:double转换为String Double dtDouble=12.31354; St ...