2021.1做题记录

devout

2021-01-02 15:35:57

Personal

## CF700E Cool Slogans **description** 给定字符串 $S$,要求构造字符串序列 $s_1,s_2\cdots s_k$,使得 $s_i$ 在 $s_{i+1}$ 中至少出现了两次,并且 $s_i$ 都是 $S$ 的子串,求最大的 $k$ **solution** 在最优情况下,$s_i$ 一定是 $s_{i+1}$ 的后缀 所以首先对于 $S$ 建出 SAM,线段树合并出 right 集合 因为 SAM 上一个状态的所有字符串等价,所以只需要考虑每个点最长的那个 在 parent tree 上 dp,用 $f[i]$ 表示 $i$ 节点表示的状态 $k$ 最大是多少 那么转移有 $f[i]=\max\{f[j]+1\}$,$j$ 为 parent tree 上 $i$ 的祖先,其中 $j$ 的 right 集合中在 $[pos[i]-len[i]+len[j],pos[i]-1]$ 上有点 注意不能判断 $[pos[i]-len[i]+len[j],pos[i]]$ 上有两点,因为克隆出来的点会重复算 显然这个 dp 满足单调性,可以倍增做到两个log,也可以记录转移节点做到一个 log [code](https://www.luogu.com.cn/record/44494257) ## CF605E Intergalaxy Trips **description** 现在有 $n$ 个点的有向完全图,边 $(i,j)$ 出现的概率是 $p_{i,j}$,$p_{i,i}=1$,问从 $1$ 到 $n$ 的最短路的期望长度 假设这个人足够聪明 $n\leq 1000$ **solution** 这道题因为这个人足够聪明,所以他可以对于一个情况动态的做出决定 因为正着推不太好确定还需要几步能到,所以我们考虑从 $n$ 倒着推,设 $E_i$ 表示从 $i$ 走到 $n$ 的答案 考虑 $E_i$ 的计算,对于 $E_i$ 的所有出边 $j$ ,显然只有当所有的 $E_k<E_j$ 的 $(i,k)$ 都没有出现的时候,我们才会考虑往 $j$ 走。所以我们可以推出一个转移 $$E_i=\sum_{j=1}^nE_j\times p_{i,j}\times \prod_{k}^{E_k<E_j}(1-p_{i,k})$$ 但是这个转移是有问题的。 因为可能存在一个情况,使得这个时候 $i$ 没法走到其他的地方,这样的情况出现的概率是 $\prod_{j}(1-p_{i,j})$,但是这个时候因为 $E_i$ 只计算的是非自环上的期望,所以转移应该写成 $$E_i=\sum_{j=1}^n\dfrac{E_j}{1-\prod_{k=1}^n (1-p_{j,k})}\times p_{i,j}\times \prod_{k}^{E_k<E_j}(1-p_{i,k})$$ 考虑转移的顺序,显然在更新的时候,如果存在一个 $E_k<E_j$,并且还没有向那里走过,那么我们应该优先从 $i$ 往 $k$ 走。 所以我们可以每次枚举最小的之前没有更新过的 $E_j$ 更新 这个做法和朴素的 $\mathcal O(n^2)$ dijkstra 类似 [code](https://www.luogu.com.cn/record/44513594) ## CF908D New Year and Arbitrary Arrangement **description** 给定 $n,pa,pb$ 每次有 $\dfrac{pa}{pa+pb}$ 的概率在后面增加一个 `a` 每次有 $\dfrac{pb}{pa+pb}$ 的概率在后面增加一个 `b` 当字符串里面有大于等于 $n$ 个 `ab` **子序列** 时停止 问 `ab` **子序列** 的期望个数 $n\leq 1000$ 对于 $10^9+7$ 取模 **solution** 发现 `b` 开头的情况不会对答案造成影响 所以钦定第一个是 `a` 我们用 $f[i][j]$ 表示有 $i$ 个 `a`,一共现在有 $j$ 个 `ab` 子序列的方案数 那么 $f[i][j]\to f[i+1][j],f[i][j]\to f[i][i+j]$ 考虑做到 $i,j\leq n$,所有 $i+j\geq n$ 的,对于答案的贡献就是 $(i+j)\times f[i][j]$ 还有一部分,是已经有 $n$ 个 `a`,但是依然没有凑够 $n$ 个 对于这一部分,我们发现他们是可以无限延伸的,$f[n][m]$ 对于答案的贡献就是 $$f[n][m]\times \sum_{i=0}^{\infty}(n+m+i)pa^ipb$$ 那么现在的瓶颈在于求后面那个东西,利用类似于等比数列的方法,我们可以推出来 $$\sum_{i=0}^\infty(n+m+i)pa^ipb=n+m+\dfrac{pa}{pb}$$ 这样的话我们就可以在 $\mathcal O(n^2)$ 的时间里求出答案了 [code](https://www.luogu.com.cn/record/44527798) ## CF578D LCS Again **description** 给定一个字符串 $S$,问有多少个与 $S$ 等长的字符串 $T$,使得 $S,T$ 的最长公共子序列长度为 $|S|-1$,并且 $S,T$ 均由前 $m$ 个小写字母组成 $n\leq 10^5$ **solution** 首先考虑一个位置,可以删掉,填上与他相异的任意一个字符,一共有 $n\times n\times (m-1)$ 种 但是显然会出问题 比如说样例1,`aa` 这种连续两个重复的,显然第二个 `a` 就不用算到了 但是这样还是有重复的问题,比如说第二个样例,我们发现,`ab` 这种类型的出现之后,我们发现,如果我们把 `a` 删掉之后,如果换成 `b`,那么放在 `b` 的左边和 `b` 的右边本质上来说就是一样的了 所以对于 `ab` 这种的串,我们也需要考虑 同样的,对于 `abababababab` 这种的,我们需要放在一起考虑 显然这个时候重复的串的个数是 $len\times(len-1)/2$ 这样的话我们就可以找到全部的了 $\mathcal O(n)$ [code](https://www.luogu.com.cn/record/44570237) ## P4027 [NOI2007] 货币兑换 **description** [link](https://www.luogu.com.cn/problem/P4027) **solution** 用 $f[i]$ 表示在第 $i$ 天最多可以赚多少钱 用 $geta[i],getb[i]$ 第 $i$ 天可以换多少 A 和 B 有一个显然的转移方程 $$f[i]=\max\{A[i]\times geta[j]+B[i]\times getb[j]\}$$ 显然这个东西不太好搞 所以我们转化一下 $$f[i]=B[i]\times\max\{\dfrac{A[i]}{B[i]}\times geta[j]+getb[j]\}$$ 显然这个东西可以斜率优化 但是发现斜率 $-\dfrac{A[i]}{B[i]}$ 和 $x$ 坐标 $geta[j]$ 不单调 **sol ver.1** 所以我们需要平衡树维护这个上凸壳 复杂度 $\mathcal O(n\log n)$ [code ver.1](https://www.luogu.com.cn/record/44621491) **sol ver.2** 我们换一种斜率优化的思路 看成若干条 $y=geta[j]x+getb[j]$ 在 $A[i]$ 点处的最大值 可以离散化后李超线段树维护 复杂度 $\mathcal O(n\log n)$ [code ver.2](https://www.luogu.com.cn/record/44640619) **sol ver.3** 我们考虑 CDQ 分治 首先对于 $-\dfrac{A[i]}{B[i]}$ 排序 然后对于时间分治。 对于左半部分,我们把它按照 $x$ 坐标排序,然后我们把左边的凸包维护出来,然后对于右半部分因为斜率是单调的,所以我们可以线性的查找 然后对于 $x$ 坐标归并就可以了 复杂度 $\mathcal O(n\log n)$ [code ver.3](https://www.luogu.com.cn/record/44644059) 实际上来看CDQ跑的最快,李超最好写,平衡树比较好想(如果不会李超的话) ## P2305 [NOI2014] 购票 **description** [link](https://www.luogu.com.cn/problem/P2305) **solution** 用 $f[i]$ 表示从 $i$ 走到 $1$ 最少花费的钱数 显然有转移 $$f[i]=\min\{f[j]+(dis[i]-dis[j])\times p[i]+q[i]\}$$ 发现就是一个树上的斜率优化。 树上斜率优化的方法主要有这些: **sol ver.1** 树上斜率优化可以淀粉质来实现。 我们找到树的重心,把重心的子树割掉之后继续求答案。 然后用重心到 $rt$ 的路径上的所有点更新重心的子树里面的答案。 更新的时候,对于重心的子树里面的点,我们把他们按照 $dis-l$ 从大到小排序,这样我们每次只需要往凸包中加入一个点。 求最优值的时候再凸壳上二分即可 淀粉质的时候,最多有 $\mathcal O(\log n)$ 层,每层处理的时候需要 $\mathcal O(n\log n)$ 的时间,总复杂度为 $\mathcal O(n\log^2n)$ [code ver.1](https://www.luogu.com.cn/record/44686601) ## P4022 [CTSC2012]熟悉的文章 **description** 给定 $m$ 个模板串 $\{T_i\}$,$n$ 次询问,每次给定一个串 $S$ 求最大的 $L$,使得可以把 $S$ 划分成若干段,使得“是任意一个模板串的子串,并且长度 $\geq L$” 的段数的长度之和 $\geq 90\% |S|$ 输入文件总长不超过 $1.1\times 10^6$ **solution** 显然 $L$ 可以二分 我们用 $f[i]$ 表示将 $i$ 位置作为一段的结尾的“是任意一个模板串的子串,并且长度 $\geq L$” 的段数的长度之和。 那么显然有转移 $$f[i]=\max\{f[j]+i-j\},j\in[i-maxlen[i],i-L]$$ 其中 $maxlen[i]$ 表示 $i$ 往前最多可以延伸多少位,使得他是一个 $T_i$ 的子串 这个东西我们只需要用 $S$ 在模板串的广义 SAM 上跑匹配就可以了 此时复杂度是 $\mathcal O(n^2\log n)$ 同时注意到,$i-maxlen[i]$ 显然是具有单调性的 所以我们可以单调队列优化 复杂度 $\mathcal O(n\log n)$ [code](https://www.luogu.com.cn/record/44731489) ## P3749 [六省联考2017]寿司餐厅 **description** [link](https://www.luogu.com.cn/problem/P3749) **solution** 显然,如果我们选了 $d_{i,j}$,那么 $d_{i+1,j}$ 和 $d_{i,j-1}$ 我们都需要选 所以问题转化成了一个最大闭合子图问题 $d_{i,j}$ 向 $d_{i+1,j}$ 和 $d_{i,j-1}$ 连容量 inf $d_{i,i}$ 向 $i$ 连 inf $i$ 向 $a_i$ 连边 然后相应的按照最大闭合子图的建边方法连边就好了 复杂度玄学 [code](https://www.luogu.com.cn/record/44801149) ## CF444E DZY Loves Planting **description** [link](https://www.luogu.com.cn/problem/CF444E) **solution** 口胡了一个二分+网络流的做法,不知道为啥没过( 考虑把所有的边从小到大排序,然后用并查集进行合并 对于每一个连通块维护一个 $siz$ 表示点的个数, $val$ 表示 $x$ 的和 那么对于每个连通块,我们都要对他外面的一些点进行匹配 所以如果 $siz\leq sumx-val$ 就可以,否则不行 $\mathcal O(n\alpha(n))$ [code](https://www.luogu.com.cn/record/44925238) ## CF773E Blog Post Rating **description** 给定一些数,你需要把他们按照任意顺序排好一个数列 $\{a_i\}$ 接下来执行函数 $\text{F}$ 初始 $\text F=0$ 从 $1\sim n$ 循环 若 $\text F<a_i,\text F++$ 若 $\text F>a_i,\text F--$ 问 $\text F_{max}$ $n\leq 5\times 10^5$ **solution** 显然,为了让答案更优,我们考虑把 $a_i$ 按照从小到大排序,这样可以让第一个操作执行的尽量的多 如果 $a_i>0$ 的时候,考虑按值域进行 dp,用 $f_i$ 表示处理完 $i$ 的数的答案 显然有转移: $$f[i]=\min\{f[i-1]+cnt[i],i\}$$ 转换一下写法 $$f[i]=\min\{f[i-1],i-cnt[i]\}+cnt[i]$$ 也就是 $$f[n]=\sum cnt[i]+\min\{i-\sum_{j=0}^icnt[j]\}$$ 观察发现,只要 $\text{F}<a_1$ 的时候这个 dp 都可以搞 考虑把前面部分删掉,发现应用操作2的部分一定是连续的 所以二分找到那个点,剩下的就是在权值线段树上随便搞了 $\mathcal O(n\log^2n)$ [code](https://www.luogu.com.cn/record/44953035) ## P2148 [SDOI2009]E&D **description** [link](https://www.luogu.com.cn/problem/P2148) **solution** 考虑 SG 函数 显然 $SG(x,y)=\operatorname{mex}\{SG(i,x-i),SG(i,y-i)\}$ 打表观察发现,后面那个东西相当于 $(x-1)|(y-1)$ 的二进制如果在第 $i$ 位上是 $1$,那么就有这个东西,否则没有 所以问题转化成了 $(x-1)|(y-1)$ 的二进制下第一个0 证明不会证(题解里有 [code](https://www.luogu.com.cn/record/44999530) ## CF273E Dima and Game **description** [link](https://www.luogu.com.cn/problem/CF273E) **solution** 考虑这个东西的SG函数 显然有 $SG(i)=\operatorname{mex}\{SG(i/3),SG(i-i/3)\}$ 观察发现这个 SG 直接搞会挂掉 但是他这个东西很长一段都是连续的,所以我们打表出来,然后做一个 dp 即可 [code](https://www.luogu.com.cn/record/45033134) ## CF285E Positions in Permutations **description** [link](https://www.luogu.com.cn/problem/CF285E) **solution** 还是考虑“钦定让 $i$ 个位置满足 $|p_i-i|=1$”的条件 观察发现,$i$ 为偶数和奇数的部分是相互没有影响的,所以我们分开考虑 考虑奇数部分,实际上可以理解为一些线段 $1-2,2-3,3-4$,而相邻的两条线段最多只能取一条 用 $f[i][j][0/1]$ 表示第 $i$ 条线段,选了 $j$ 条,这一条选了/没选的情况数 这样我们就可以得到整体钦定的 $f(n)$,注意 $f(i)$ 还要乘上 $(n-i)!$ 接下来进行二项式反演 $$g(m)=\sum_{i=m}^n (-1)^{i-m}\binom{i}{m}f(i)$$ 就可以得到答案啦( 复杂度 $\mathcal O(n^2)$ [code](https://www.luogu.com.cn/record/45052387) ## CF436F Banners **description** 现在有 $n$ 个人,每个人有两个参数 $a_i,b_i$ 有两个参数 $c,p$ 对于第 $i$ 个人,如果 $b_i\geq c$,那么可以获得 $wc$ 的利润($w$ 为一定值) 否则如果 $a_i\geq p$,那么可以获得 $p$ 的利润 现在要求对于每一个 $c$,确定利润最大的 $p$ $n\leq 10^5$ **solution** 显然可以把人按照 $b$ 排序,这样只需要按照顺序插入数据结构即可 接下来的问题是区间加等差数列,全局求 max 发现 log 数据结构不太可做,所以考虑万能的分块 每插入一个 $x$,相当于 $[1,x]$ 的出现次数都要加一 设 $cnt_i$ 表示 $i$ 在散块中被累加的次数,$k$ 表示 $i,j$ 所在的块被整体加上的次数 那么如果 $i$ 的贡献小于 $j$ ,即满足 $$cnt_i+ki<cnt_j+kj$$ 移项,可以得到 $$\dfrac{cnt_j-cnt_i}{i-j}<k$$ 可以用一个凸包维护每一块里面的内容 插入之后暴力重构一下对应点上的凸包 查询的时候每块都查询一遍取最优即可 $\mathcal O(n\sqrt n)$ [code](https://www.luogu.com.cn/record/45333119) ## CF1009F Dominant Indices **description** [link](https://www.luogu.com.cn/problem/CF1009F) **solution** 显然有一个 $\mathcal O(n^2)$ 的转移方程 $$f[u][i]=\sum f[v][i-1]$$ 发现这个复杂度是 $\mathcal O(\sum dep)$ 的 考虑长链剖分优化 长链剖分优化dp,适用于复杂度与深度相关的树形dp问题 其思路为,我们对于每个重儿子,直接继承状态,对于每个轻儿子暴力合并 这样做为什么是正确的呢,我们发现每条链都只会在链头被合并一次,总复杂度是所有链长之和,我们发现这就是 n,相应的,如果我们使用 swap 来获取重儿子上的信息,我们同样可以把空间做到线性 $\mathcal O(n)$ [code](https://www.luogu.com.cn/record/45393565) ## CF468D Tree **description** [link](https://www.luogu.com.cn/problem/CF468D) **solution** 首先第一问很好解决 答案就是 $\sum w_i\times\min(siz_i,n-siz_i)$ 考虑第二问 我们需要让我们的每一个操作都跨过一个点,这个时候肯定是最优的 显然这个点是重心 我们把重心当做根,考虑重心连出去的每一棵子树 因为要求排列的字典序尽量的小,我们从1到n考虑 对于每个点 $i$,我们要在另一棵子树里面找一个点 $j$ 所以我们找不在这棵子树里最小的那个 但是会出现一些问题,有可能某一时刻,存在一个子树 $k$,使得里面被匹配的和没被匹配的点数之和和 $n-i+1$ 相等,这个时候我们必须在子树 $k$ 里面选了,因为我们一次不能在同一棵子树里面选两个点 注意重心的特殊情况,需要特判 用一个set $S_i$ 维护子树 $i$ 中的所有没被匹配的点的集合 $low$ 维护所有 $S_i$ 中最小的集合 $num$ 维护每个子树里面还剩多少个没匹配的和没被匹配的。 $\mathcal O(n\log n)$ STL 真的恶心 [code](https://www.luogu.com.cn/record/45417745) ## CF536D Tavas in Kansas **description** [link](https://www.luogu.com.cn/problem/CF536D) **solution** 首先以S,T为起点跑一遍最短路,对于距离离散化, 然后考虑一个 dp,用 $f[0/1][i][j]$ 表示现在是先手/后手取,先手取到 $i$,后手取到 $j$ 那么 $f[0][i][j]$ 可以从 $\max\{f[0][i+1][j],f[1][i+1][j]\}$ 转移过来 $f[1][i][j]$ 可以从 $\min\{f[0][i][j+1],f[1][i][j+1]\}$ 转移过来 但是注意因为他要求必须要取到点,所以如果发现 $dis1=i+1$ 的部分没有 $dis2>j$ 的,我们必须让上一行也是他在取 倒推是因为这个dp有后效性 $\mathcal O(n^2)$ [code](https://www.luogu.com.cn/record/45461231) ## P4859 已经没有什么好害怕的了 **background** 老虚接笔了! **description** [link](https://www.luogu.com.cn/problem/P4859) **solution** 对于 $a,b$ 从小到大排序 用 $f_{i,j}$ 表示 a 考虑到第 $i$ 个位置,钦定 $j$ 个 $a>b$ $$f[i][j]=f[i-1][j]+f[i-1][j-1]\times(low_i-j+1)$$ 其中 $low_i$ 表示 $b$ 里面有多少个比 $a_i$ 小的 最后 $f[n][i]$ 还要乘上 $(n-i)!$ 然后二项式反演一下就好了 $\mathcal O(n)$ [code](https://www.luogu.com.cn/record/45553619) ## CF449E Jzzhu and Squares **background** 毒瘤数学题 **description** [link](https://www.luogu.com.cn/problem/CF449E) **solution** 令 $n\leq m$ 考虑枚举正方形的大小 $i$,那么答案为 $$ans=\sum_{i=1}^{n}(n-i+1)(m-i+1)f(i)$$ 其中 $f(i)$ 表示所有的恰好包含在这个 $i\times i$ 的正方形中的单位正方形数量 $f(i)=i^2$ ??? 注意正方形可以斜着放 $$f(n)=n^2+\sum_{i=1}^{n-1}((n-2i)^2+4g(i,n-i))$$ 其中 $i$ 枚举的是旋转的量,$g(x,y)$ 表示一个 $x\times y$ 的直角三角形里面的整正方形的个数 考虑 $g(x,y)$ 的计算,相当于是求里面的整点数量+斜边整点数量,又皮克定理,我们可以得到 $$g(x,y)=\dfrac{xy-x-y+\gcd(x,y)}{2}$$ 带到原来的式子里 $$f(n)=n^2+\sum_{i=1}^{n-1}((n-2i)^2+2xy-2x-2y+2gcd(i,n))$$ ($\gcd(x,y-x)=\gcd(x,y)$) 然后把这个东西展开,问题在于求 $\sum \gcd(i,n)$ 显然有 $$\sum_{i=1}^{n-1}\gcd(i,n)=\sum_{d|n}\dfrac{n}{d}\phi(d)-n$$ 把这堆东西通通预处理出来 然后再把 $ans$ 那一层的式子继续展开,继续预处理 复杂度 $\mathcal O(n\ln n)$ [code](https://www.luogu.com.cn/record/45483727) ## CF319B Psychos in a Line **description** 显然有 $n$ 个人,每个人有一个分数 每一回合如果一个人比他右边的人分数高,他会把右边的人给杀了 每一回合杀人是同时进行的,所以一个人可以既杀了人又没杀人 被杀的人立即退出游戏 问游戏能进行几回合 $n\leq 10^5$ **solution** 显然,对于一段单调递增的区间,是不会发生任何事情的,并且只有这一段单调递增的末尾那个位置能杀人 如果把序列分成连续的每段中单调递增的几段的话 那么显然对于 $i$,他能杀的人就是后面那些段的段长的max 那么我们可以用单调栈转移一个dp 感觉不太好解释,看代码 [code](https://www.luogu.com.cn/record/45598416) ## P4770 [NOI2018] 你的名字 **background** 1k AC 祭! **description** 给定一个串 $S$,每次询问 $T,l,r$ 表示在 $T$ 串中有多少个本质不同的子串,是的该子串不是 $S[l...r]$ 的子串 $|S|\leq 5\times 10^5$ **solution** 显然对于 $S$ 建立 SAM,然后线段树合并搞出 right 集合。 询问的时候,我们拿 $T$ 在 $S[l...r]$ 这一部分的 SAM 上跑匹配 答案就是 $\sum\{i-\max($匹配长度,T中之前和 T[1...i] 的最长公共后缀长度$)\}$ 后面那个东西我们可以对于 T 建立 SAM,在边插入的过程中求出 注意一些细节,比如说当匹配长度为 $l$ 的时候,我们需要查询的是有没有 $[L+l,R]$ 的 right集合是否不为空,而非 $[L,R]$ 以及我们不能直接跳到 $link$,应该让 $l$ 一位一位的减,因为有可能中间到一定的长度就出来了一个可以往下走的 [code](https://www.luogu.com.cn/record/45692421) ## xsy NOI2021冬令营模拟测试赛(二十五) B gre **description** 给定 $n,k$,求字典序最小的,由 $k$ 个小写字母组成的,长度为 $n$ 的,满足任意前缀出现的字母的次数相同,且任意后缀出现的字母的次数相同的字符串 $n\leq 10^5,k\leq 26,t\leq 100$ **solution** 显然前面摆一堆 `a` 更优,所以希望后面那一坨尽量的短 假设 $s(i)$ 表示 $i$ 个字符组成的后面那一坨 显然 $s(i)$ 变成 $s(i+1)$ 的过程中需要把所有的字母往后平移一格 那么 $s(i+1)$ 前面至少要有两个 `a`,因为 $s(i)$ 的开头肯定是一个 `a` 同理,因为对于每一个前缀和后缀,我们都保证的是 `a` 比 `b` 恰好多1,所以在每一个 `b` 后面我们需要给他接上一个 `a` [code](http://xsy.gdgzez.com.cn/JudgeOnline/showsource.php?id=290211) ## xsy NOI2021冬令营模拟测试赛(二十五) A duliu **description** 给定一个数列,$m$ 次询问,每次询问 $l,r,x$ 表示,这个数列中区间 $[l,r]$ 的所有连续子区间 $[a,b]$ 满足 $2\times (b-a+1)\times (sum_b-sum_{a-1})\geq x$ 中,$\max_{a\leq i\leq b}A_i$ 的最小值是多少 $n\leq 3\times 10^5,A_i\leq 10^7$ **solution** 最开始想到的是一个整体二分+线段树维护max(区间和$\times$区间长度)的 $\mathcal O(n\log ^2n)$ 的做法 后来看 sol 可以一个log 显然 $[a,b]$ 只能是 $[l,pl],[pr,r]$ 或者 $[a,b]$ 满足 $A_{a-1},A_{b+1}>\max_{a\leq i\leq b}A_i$ 对于前一类,我们可以直接二分找到 对于后一类,这样的区间只会有 $\mathcal O(n)$ 个 我们可以通过按照大小加入,利用并查集合并的方法找到这些区间 然后我们把询问离线一下,把询问区间和第二类区间都从大到小排序 按照顺序加到一棵线段树里面 对于询问 $[l,r]$,实际上我们只需要查找 $a\in[l,pr]$ 的部分 问什么这样是对的呢,显然在 $pr$ 右边的肯定都没有意义 如果在 $[l,pr]$ 中有一个区间的右端点在 $r$ 的右边,那么这个区间一定不优于 $[pr,r]$,所以这样依然是对的 $\mathcal O(n\log n)$ [code](http://xsy.gdgzez.com.cn/JudgeOnline/showsource.php?id=290213) ## P3641 [APIO2016]最大差分 **background** 一月最后一题 函数交互第一题 **description** [link](https://www.luogu.com.cn/problem/P3641) **solution** 对于前三十分我们可以先知道 $a_1,a_n$ 然后 $MinMax(a_1+1,a_n-1,a_2.a_{n-1})$ 就知道 $a_2,a_{n-1}$ 了,最多调用 $\dfrac{n+1}{2}$ 次 对于后七十分 我们肯定还是要先求出 $a_1$ 和 $a_n$ 那么显然我们的答案是大于等于 $\dfrac{a_n-a_1}{n-1}$ 的,所以我们对于序列按照这个长度分块。 显然同一块里面的数我们是不需要考虑的,只需要考虑每一块的最小值和前面一个有数的块的最大值的差即可 这样的话,我们需要最多做 $n+1$ 次查询,查询到了 $n+n-2$ 个数,所以可以在 $3n-1$ 的次数内得到答案,符合条件 [code](https://www.luogu.com.cn/record/45875342)