首页 > 其他分享 >SOJ1835 题解

SOJ1835 题解

时间:2023-09-28 16:35:30浏览次数:39  
标签:dots max le 题解 路径 权值 SOJ1835

题意

给出一个 \(1,\dots,n+1\) 的排列 \(v_{1},\dots,v_{n+1}\) 与两组权值 \(a_{1,\dots,n},b_{1,\dots,n}\)。满足 \(v_{n+1}=n+1\)。

构造一张 \(n+1\) 个点的有向图:

  • 对于 \(i=1,\dots,n\),从 \(i\) 向 \(i+1\) 连一条权值为 \(a_i\) 的边;
  • 对于 \(i=1,\dots,n\),找到最小的 \(i<j\le n+1\) 满足 \(v_j>v_i\),从 \(i\) 向 \(j\) 连一条权值为 \(b_i\) 的边。

一条路径的权值为路径上边权的最大值。特别的,若一条路径不包含任何边,则其边权为 \(0\)。

有 \(q\) 次询问,每次询问给出 \(x,y\)(\(x\le y\)),求 \(x\) 到 \(y\) 的权值最小的路径的权值。

\(1\le n,q\le 5\times 10^5\),\(1\le a_i,b_i\le 10^9\)。

题解

设 \(i\) 向 \(p_i\) 连权值为 \(b_i\) 的边。简单分析可知,一定不存在 \(i<j\wedge p_i<p_j\)。于是当 \(p_x\le y\) 时,路径一定会经过 \(p_x\)。

设 \(d_x\) 为 \(x\) 走到 \(p_x\) 的最小路径权值。一种走法是直接走 \(b_x\) 的边;另一种是先走到 \(x+1\)。因为 \(p_{x+1}\le p_x\),接下来一定会走到 \(p_{x+1}\),故权值对 \(d_{x+1}\) 取 \(\max\),并走到 \(p_{x+1}\),重复上述过程。显然最终一定会走到 \(p_x\)。这个过程可以用倍增优化做到一个 \(\log\)。

然后考虑询问。一种贪心方法是:若 \(p_x\le y\),则权值对 \(d_x\) 取 \(\max\),走到 \(p_x\);否则权值对 \(a_x\) 取 \(\max\),走到 \(x+1\)。

将所有询问离线,从左往右扫描线。设当前到 \(i\),考虑所有 \(j<i\wedge p_j>i\) 的 \(j\)。将其排序,设为 \(j_1,\dots,j_k\),并另将 \(i\) 设为 \(j_{k+1}\)。则从 \(x\) 出发,路径一定是先不断跳 \(p_x\) 跳到 \(j_l\),再跳到 \(j_l+1\),再不断跳 \(p\) 跳到 \(j_{l+1}\)。一直跳到 \(j_{k+1}\) 为止。发现是一段后缀 \(\max\),可以用线段树维护每个 \(j\) 跳到下一个 \(j\) 的最小路径权值。因为扫描的时候 \(j\) 的更新类似栈,且每个 \(j\) 只会入栈出栈一次,故复杂度 \(O(n\log n)\)。

PS:其实 \(j\) 数组就是考虑到 \(i\) 时笛卡尔树上的右链。这样思考形象一些。

标签:dots,max,le,题解,路径,权值,SOJ1835
From: https://www.cnblogs.com/fish07/p/17736050.html

相关文章

  • LOJ 6479 [ICPC World Finals 2017] 小小水管工 Son of Pipe Stream 题解
    更好的阅读体验题意原题链接给出\(n\)个城市和\(m\)条双向管道,以及两个实数\(v\)和\(a\)。有两种液体,分别是水和Flubber(下面简写为W和F)。\(1\)号和\(2\)号城市分别生产Flubber和水,并通过管道流入\(3\)号城市。对于一条管道,其中可以同时存在两种液体,但是方向......
  • Jenkins问题解决_控制台输出:Windows下中文乱码,文本方式查看显示正常
    背景使用Git克隆代码时出现错误,控制台输出内容为中文乱码,文本方式查看显示正常Jenkins版本:2.423原因Jenkins内JAVA编码设置问题查看jenkins编码格式系统管理——>系统信息,查找sun.jnu.encoding字段。如果不是UTF-8,就可能导致中文支持有问题(GBK等支持度不够)。解决设......
  • 题解 [HEOI2016/TJOI2016] 排序
    题目链接看到这道题按照套路首先想到二分答案(即二分\(q\)位置上的数,记作\(mid\))。再按照套路将大于\(mid\)的数字设为\(1\),将等于\(mid\)的数设为\(2\),小于\(mid\)的数字设为\(0\)。那么对于区间\([l,r,0]\)操作,应该先讲\(0,1,2\)的数量找出来,然后按照从小到大......
  • 题解 CF1873H【Mad City】
    其他题解怎么又Tarjan又Dijkstra的,这是div4H的样子吗,来个简单好写的做法。题面里的人名太复杂了,本题解中称为警察和小偷。注意到,如果小偷成功到达了环上,那么一定不会被警察抓到。因为小偷知道警察下一步会走到哪里,他可以执行相同的操作(顺时针/逆时针/静止),使得他和警察之间......
  • [ARC124C] LCM of GCDs 题解
    题面给定\(N\)个正整数对\((a_i,b_i)\)和两个初始为空的集合\(S,T\),你可以选择将每个数对的两个元素划分到两个不同的集合中。求\[\max\operatorname{lcm}(\gcd\limits_{x\inS}x,\gcd\limits_{y\inT}y)\](\(1\leN\le50,1\lea_i,b_i\le10^9\))。题解首先,......
  • P4370 [Code+#4] 组合数问题2-题解-有关对数的小技巧
    20230927P4370[Code+#4]组合数问题2-solStatement传送门给你两个数\(n,k\),要求对于组合数\(C_{a}^{b}\)找到任何\(k\)个,让他们的和最大,且组合数各不相同,当且仅当\(a,b\)不完全相同时,组合数不同。Solution首先,很容易发现\(C_{n}^{m}\gtc_{n-1}^{m}\),所......
  • CF364D Ghd 题解
    CF364DGhd题解题目大意给定一个长度为\(n\)的序列,你需要从中选出一个元素个数不少于\(\left\lceil{\frac{n}{2}}\right\rceil\)的子序列,使得这个子序列中所有元素的\(\gcd\)最大。分析数据范围吓人。\(10^6\),但是根本想不到什么\(O(n\logn)\)或\(O(n)\)的算法......
  • [ARC125B] Squares 题解
    题意给定正整数\(N\),求满足如下条件的正整数对\((x,y)\)的数量:\(1\lex,y\leN\)\(x^2-y\)为完全平方数(\(0\)也是完全平方数)(\(1\leN\le10^{12}\))。题解因为\(x^2-y\)为完全平方数,设其为\(z^2\),那么有\[\begin{aligned}x^2-y=z^2\\\end{al......
  • [题解] Codeforces Round 900(Div.3) E~F
    CodeforcesRound900(Div.3)E~FE.Iva&Pav因为按位与的结果不会随着越多数字的增加而增加,因此我们可以利用这个性质二分出右端点,只需要一个可以查询区间的数据结构即可。或者是按位考虑第\(i\)个数字的第\(k\)位,后缀最近的\(0\)的位置,按位考虑也可以。但是这题使用二分......
  • ACAM 学习笔记 | 附 YbtOJ 全部题解
    怎么有人现在才学ACAM呢。好像比SAM简单挺多啊,也不记得当时是哪里看不懂。AC自动机(✔)自动AC机(✘)概述ACAM(Aho–CorasickAutomaton),是用来解决多模式串匹配的字符串算法。它的结构是个DAG,其中点表示状态,边表示转移。这一点上各种自动机都是相同的。具体来说,可以感性......