[杂谈] 日报 D9

还是把模拟赛的题记录一下 .

[SNOI2020] 排列

首先处理一下 \(k=n\) 的情况 . 题目其实直接把做法给出来了 , 只需右端点扫描线 , 线段树维护 \(mx-mn+l\) , 维护最大值个数即可 .

\(mx\) 和 \(mn\) 的维护经典用单调栈找到修改区间 , 然后分别维护 \(mx+l,-mn+l\) 的最值及个数即可实现修改 .

当然有更简单的办法 , 只需在单调栈操作中动态修改最值 , 因为这样做每次修改的区间原最值相同 , 可以全用区间加处理 , 会更简便一些 .

这样先处理出左边 \(k\) 个的区间数 .

然后就是如何构造排列 . 发现给定的数把值域 \([1,n]\) 分成若干个区间 , 显然把所有区间都连续地放置最优 , 这样右边的区间数就确定了 , 且最大化 .

然后要最大化横跨左右的区间个数 , 发现只考虑左边的点 , 应该选择一个后缀 , 构成一个区间 \([l,r]\) 且 \([l,r]\) 内所有的左点都包含在选定的后缀中 , 之后 , 所有在 \([l,r]\) 内部的右区间也一定要选 . 这时最多只够成了一个合法区间 . 增加区间数的方式可以是逐一加入 \([l',l]\) 或 \([r,r']\) 这两个紧邻 \([l,r]\) 的右区间 . 加入一个 \(len\) 长紧邻区间可以增加 \(len\) 的答案 .

发现如果区间从 \([l_1,r_1]\) 变成 \([l_2,r_2]\) 的过程中 , 如果 $l_1\ne l_2 \wedge r_1 \ne r_2 $ , 那么显然当前的紧邻区间下一步就是普通内含区间 , 那么直接逐一加入紧邻区间一定最优 .

考虑有一个端点相等时 , 例如 \(l_1=l_2\) , 那么这一端的紧邻区间 \([l',l_1]\) 如果在 \(l_1\) 处贡献 , 可能在 \(l_2\) 处 , 因为拓展区间时加入了新的内含区间 , 导致 \([l',l_1]\) 不在最右端 , 也就不能在 \(l_2\) 处进行贡献 . 因此要 dp , 设 \(f_{i,5}\) 表示在第 \(i\) 步的 \(5\) 种情况 ( 左右都不选 , 只选左 , 只选右 , 先左后右 , 先右后左 )下的最大收益 , 在有端点相等时 , 讨论增加了 0/1/多个新的内含区间的影响 .

感觉挺简单的 , 不知道为什么写了 10k 多 .

当然后面的 dp 本质上就是给所有作为紧邻区间的区间找一个最优的贡献时机 , 这用贪心也能做到 .

总体想法就两个 , 一个是线段树处理 , 一个是这种有贪心性质的 dp .


然后就是口胡PKUCUC23的事情了 , 这个就不往日报里写了 , 大概还是单写一下题解好了 .


posted @ 2025-06-03 21:27  youlv  阅读(35)  评论(0)    收藏  举报