「JOISC 2019 Day4」蛋糕拼接 3
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的更多相关文章
- @loj - 3039@ 「JOISC 2019 Day4」蛋糕拼接 3
目录 @description@ @solution@ @accepted code@ @details@ @description@ 今天是 IOI 酱的生日,所以她的哥哥 JOI 君给她预定了一个 ...
- 「JOISC 2019 Day3」穿越时空 Bitaro
「JOISC 2019 Day3」穿越时空 Bitaro 题解: 不会处理时间流逝,我去看了一眼题解的图,最重要的转换就是把(X,Y)改成(X,Y-X)这样就不会斜着走了. 问题变成二维平面上 ...
- 【LOJ】#3036. 「JOISC 2019 Day3」指定城市
LOJ#3036. 「JOISC 2019 Day3」指定城市 一个点的可以dp出来 两个点也可以dp出来 后面的就是在两个点的情况下选一条最长的链加进去,用线段树维护即可 #include < ...
- 【LOJ】#3034. 「JOISC 2019 Day2」两道料理
LOJ#3034. 「JOISC 2019 Day2」两道料理 找出最大的\(y_{i}\)使得\(sumA_{i} + sumB_{y_i} \leq S_{i}\) 和最大的\(x_{j}\)使得 ...
- 【LOJ】#3032. 「JOISC 2019 Day1」馕
LOJ#3032. 「JOISC 2019 Day1」馕 处理出每个人把馕切成N段,每一段快乐度相同,我们选择第一个排在最前的人分给他的第一段,然后再在未选取的的人中选一个第二个排在最前的切一下,并把 ...
- 【LOJ】#3033. 「JOISC 2019 Day2」两个天线
LOJ#3033. 「JOISC 2019 Day2」两个天线 用后面的天线更新前面的天线,线段树上存历史版本的最大值 也就是线段树需要维护历史版本的最大值,后面的天线的标记中最大的那个和最小的那个, ...
- 【LOJ】#3031. 「JOISC 2019 Day1」聚会
LOJ#3031. 「JOISC 2019 Day1」聚会 听说随机可过? 我想了很久想了一个不会被卡的做法,建出前\(u - 1\)个点的虚树,然后找第\(u\)个点的插入位置,就是每次找一条最长链 ...
- 【LOJ】#3030. 「JOISC 2019 Day1」考试
LOJ#3030. 「JOISC 2019 Day1」考试 看起来求一个奇怪图形(两条和坐标轴平行的线被切掉了一个角)内包括的点个数 too naive! 首先熟练的转化求不被这个图形包含的个数 -- ...
- LOJ#2882. 「JOISC 2014 Day4」两个人的星座(计算几何)
题面 传送门 题解 我们发现如果两个三角形相离,那么这两个三角形一定存在两条公切线 那么我们可以\(O(n^2)\)枚举其中一条公切线,然后可以暴力\(O(n^3)\)计算 怎么优化呢?我们可以枚举一 ...
随机推荐
- vue和mint-ui loadMore 实现上拉加载和下拉刷新
首先安装mint-ui组件库 npm install mint-ui 在main.js中引入mint-ui和样式 import 'mint-ui/lib/style.css' import MintU ...
- vscode快速生成html的基本代码
转载自:https://blog.csdn.net/suwyer/article/details/81237880 在vscode里新建html文件, 总是要一行一行的写标准的html代码: 而DW新 ...
- Java-GUI编程之事件处理
事件处理 前面介绍了如何放置各种组件,从而得到了丰富多彩的图形界面,但这些界面还不能响应用户的任何操作.比如单击前面所有窗口右上角的"X"按钮,但窗口依然不会关闭.因为在 AWT ...
- Shiro之权限管理的概念
文章目录 前言:什么是shiro 一.什么是权限管理? 举例 二.权限管理的具体分类 1.身份认证 2.授权 总结 前言:什么是shiro Apache Shiro 是一个开源安全框架,提供身份验证. ...
- 电机三环pid控制及调试经验
一.伺服电机的双环pid 双环pid在正常底盘运动的控制中已经足够了,但是对于双轴云台的控制来说,双环pid的云台控制的响应速度是远远不够的,所以加入了电流环的控制. 两篇大佬的文章--这是我学习pi ...
- openfeign使用踩坑记录
1.报ClassNotFound com.netflix.config.CachedDynamicIntProperty问题,原因是spring-cloud-starter-openfeign的spr ...
- 最强Postman替代品,国产软件Apifox到底有对牛?
作为软件开发从业者,API 调试是必不可少的一项技能,在这方面 Postman 做的非常出色.但是在整个软件开发过程中,API 调试只是其中的一部分,还有很多事情 Postman 无法完成,或者无法高 ...
- 五、JDK的安装与配置
一.JDK下载与安装 1.1.下载JDK安装包 博主在这里给大家准备了一个64位操作系统的jdk1.8以便大家下载(使用的是迅雷) 点击此处下载 提取码:dfbt 如果其他小伙伴的电脑版本不一样,博主 ...
- Java学习day14
可变参数用作方法的形参,方法参数的个数就可变 格式:修饰符 返回值类型 方法名(数据类型...变量名){ } 方法内的形参只能有一个,这里的变量是一个数组 public static <T> ...
- java 竞赛常用方法
一,基本数据类型 1.int,float.double等转换为字符串用 String.valueOf方法 eg:double转换为String Double dtDouble=12.31354; St ...