首页 > 其他分享 >「JOI Open 2019」三段跳び

「JOI Open 2019」三段跳び

时间:2024-02-14 15:00:15浏览次数:24  
标签:le 二元 max 最大值 2019 mathcal 区间 JOI Open

题意:

\(n\) 个数,\(q\) 次查询,每次给出区间 \([l,r]\),求区间内满足以下条件的三元组 \((x,y,z)\) 中 \(a_{x}+a_{y}+a_{z}\) 的最大值:

  • \(x<y<z\)。

  • \(y-x\le z-y\)。

做法

考虑可能成为答案的 \(x\) 和 \(y\) 组成的二元组 \((x,y)\) 是很少的。事实上,这是 \(\mathcal O(n)\) 级别的。我们可以考虑这样的 \((x,y)\) 满足的性质:其必然有 \(\max\limits_{i=x+1}^{y-1}a_i\le\min\{a_x,a_y\}\),否则将一个小的位置换成中间的最大值肯定更优。

而这个条件非常舒服,可以直接单调栈求出这些二元组。具体地,维护一个不降的栈,在访问栈顶时(不一定要成功弹栈)把顶端元素与当前元素组成的二元组加入。这样容易发现不会漏掉任何一个合法的二元组。

得到这 \(\mathcal O(n)\) 个二元组过后怎么快速计算呢?考虑离线下来,按左端点排序,扫描线从右往左扫,不断加入新的二元组,并对某一个后缀进行更新,表示这一个后缀作为 \(z\) 可以与 \((x,y)\) 组合。具体地,令 \(b_i\) 为 \(i\) 作为 \(z\) 时 \(a_x+a_y\) 的最大值。那么修改操作就是区间的 \(b_i\) 对一个值取最大值,查询的是区间 \(a_i+b_i\) 的最大值。这个用线段树怎么做呢?

答案很简单!维护某个区间的 \(a_{\max}\) 和 \(v_{\max}\) 表示区间内 \(a_i\) 的最大值与 \(a_i+b_i\) 的最大值,那么当更新的值为 \(d\) 时只需要 \(v_{\max}\leftarrow \max\{v_{\max},a_{\max}+d\}\) 即可。自己稍加思考便可想清楚了。

至此,我们用 \(\mathcal O((n+q)\log n)\) 的时间复杂度解决了这个问题。

标签:le,二元,max,最大值,2019,mathcal,区间,JOI,Open
From: https://www.cnblogs.com/tulipenoire/p/18015206

相关文章

  • openJudge | 统计学生信息(使用动态链表完成)C语言
    总时间限制:1000ms内存限制:65536kB描述利用动态链表记录从标准输入输入的学生信息(学号、姓名、性别、年龄、得分、地址)其中,学号长度不超过20,姓名长度不超过40,性别长度为1,地址长度不超过40输入包括若干行,每一行都是一个学生的信息,如:00630018zhouyanm2010.028......
  • OpenCL规约算法例子
    本文给出一个规约算法求数组的和的例子。本例子求20000000(两千万)个整数的和。运算过程分成了两步,第一步是GPU对每一个工作组内规约求和,然后将每个工作组的求和结果放到数组中输出。第二步是对输出的数组用CPU求和。实际运行对比发现GPU的效率不如用CPU直接求和。下述算法运行环境......
  • JOISC 2018 题解
    JOISC2018loj上有几乎全部的题目,写了题意的就是loj上没有的。D1T1简单题。根据颜色段均摊的结论,每个点到根的路径上颜色段的总和是\(O(n\logn)\)的,于是直接每次暴力找颜色段即可。复杂度\(O(n\log^2n)\)。提交记录D1T2又是计算几何。我们需要画出一条闭合折线,并且......
  • JOISC 2017 题解
    JOISC2017loj上有几乎全部的题目,写了题意的就是loj上没有的。D1T1开场放大。首先,对于一个点,它最后覆盖的一定是一个矩形,这就意味着如果我们知道了\(u,d,l,r\)操作各用了多少次,他们之间的顺序是不重要的,我们可以直接当做把一种操作做完再做剩下的操作,这样就可以做到\(O(......
  • JOISC 2016 题解
    JOISC2016loj上有几乎全部的题目,写了题意的就是loj上没有的。D1T1一开始把题目看错了,还写了棵线段树。把询问离线,倒着扫一遍,就变成了求最长不上升子序列,用树状数组维护即可。提交记录D1T2来自Kubic的神仙做法。考虑Filp一个位置和剩下所有位置,记录每个数作为答案......
  • JOISC 2015 题解
    JOISC2015loj上有几乎全部的题目,写了题意的就是loj上没有的。D1T1简单题。因为\(k\)很小,考虑依次确定最后第\(i\)位是什么。我们倒序考虑所有操作,维护最后第\(i\)位当前在第几位,就可以一直推下去。提交记录D1T2直接暴力复杂度就是\(O(k4^k)\)的,可以通过。提交......
  • JOISC 2014 题解
    JOISC2014loj上有几乎全部的题目,写了题意的就是loj上没有的。D1T1想到了最短路的做法,不过可能还需要整体二分,复杂度至少有2log。有复杂度更优秀的贪心做法。把边按时间倒序加边,然后从终点开始dfs来更新每个点可以的最晚出发时间,每条边走之后肯定就不会再让答案变优了,......
  • 字符串Stringjoiner
    不能添加数字,只能添加字符串......
  • [SWPU2019]Network
    [SWPU2019]Network附件是一个txt文件,打开看到都是些数字每一行都只有一个值,63,255,191等等,不难发现,这些值都为2的n次方减去一后的值,此处为TTL加密。TTL加密:简单来说就是,图中63,127,191,255转化为二进制的值分别为00111111,01111111,10111111,11111111。发现只有前两位不同,TTL加密就......
  • 解决jstack的报错:Unable to open socket file
    原文网址:​​解决jstack的报错:Unabletoopensocketfile_IT利刃出鞘的博客-CSDN博客​​简介说明本文介绍解决jstack的报错的方法,报错信息为:Unabletoopensocketfile。分享Java技术星球:​​自学精灵-IT技术星球​​详细报错信息:进程号:Unabletoopensocketfile:......