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. Spark项目应用-电子商务大数据分析总结

    一. 数据采集(要求至少爬取三千条记录,时间跨度超过一星期)数据采集到本地文件内容   爬取详见:python爬取京东评论   爬取了将近20000条数据,156个商品种类,用时2个多小时,期间中断数 ...

  2. 字符串反转&说反话

    题目描述 写出一个程序,接受一个字符串,然后输出该字符串反转后的字符串.(字符串长度不超过1000) 输入描述: 输入N个字符 输出描述: 输出该字符串反转后的字符串 示例1 输入 abcd 输出 d ...

  3. 常见的JVM 面试题

    1.讲一讲JVM的跨平台与跨语言 跨平台 我们写的一个类,在不同的操作系统上(Linux.windows.Mac OS)执行,效果是一样的.这就是JVM的跨平台性. 跨语言 JVM只识别字节码,JVM ...

  4. LC-数组-二分查找-704

    二分查找 [left, right] 方式 [left, mid -1] [mid + 1, right] int left = 0, right = nums.length - 1; while ( ...

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

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

  6. DirectX11 With Windows SDK--38 级联阴影映射(CSM)

    前言 在31章我们曾经实现过阴影映射,但是受到阴影贴图精度的限制,只能在场景中相当有限的范围内投射阴影.本章我们将以微软提供的例子和博客作为切入点,学习如何解决阴影中出现的Atrifacts: 边缘闪 ...

  7. 苞米面 C++ 模板库 介绍

    苞米面 C++ 模板库 简介 苞米面 C++ 模板库,无需编译,直接包含头文件就可以. 所有模板类和算法都包含在 bmm 名字空间里,例如: bmm::recent. 需要 C++ 编译器,支持 C+ ...

  8. Ubuntu Qt5 Firebird 数据库驱动安装

    Ubuntu Qt5 Firebird 数据库驱动安装 apt install libqt5sql5-ibase

  9. .NET Core(.NET6)中gRPC注册到Consul

    一.简介 上一篇文章介绍了.NET Core 中使用gRPC,在微服务中,我们通常要把服务做成服务注册,服务发现的方式,那么这里来说一下gRPC是如何注册到Consul中的. Consul的安装这里就 ...

  10. SerialPort-4.0.+ 使用说明(Kotlin版本)

    SerialPort-4.0.+ 项目官网 Java版本使用说明 介绍 SerialPort 是一个开源的对 Android 蓝牙串口通信的轻量封装库,轻松解决了构建自己的串口调试APP的复杂程度,让 ...