【转载】mx noip day2 sol

T1 捏捏

这个题才是签到题。

右边为逆序对总数。为左边的值找一个具体意义,我们将证明这个值不大于等号右边的值。

考虑冒泡排序,右边即冒泡排序交换的次数(每交换一次一定减少一个逆序对)。左边一定不大于冒泡排序交换次数,因为左边的值只考虑了复原需要向左移动的数,而未考虑向右移动的数。更具体的是左边就是冒泡排序交换次数的下界。

观察何时不能达到下界。如果一个数既往右边移动又往左边移动即无法到达下界。所以如果有类似于 3 2 1 这样的子序列一定不合法,也即如果存在长度为 3 的下降子序列即不合法(这里已经可以推导出 DP 定义)。

也可以考虑动态地向后加入数,计算两边的增量,分类讨论:

  • aii:此时 ai 为前 i 个数的最大值,因为 aii 表示 i 之后有 aii 个比 ai 小的数,那前 i 个数一定都不大于 ai
  • aiimax(0.iai)=0,那就说明后面没有比 ai 更小的数,满足 1ai 全部出现。

那么加入的 ai 要么是新的前缀最大值,要么更小的数已经全部出现过。

可以得到一个 O(n2) 的转移,定义 fi,j 表示前 i 个数中最大值为 j,每次要么选一个更大的数,要么补一个唯一合法的数。这个转移可以放到网格图上考虑。

那么剩下的工作是处理不同的前缀。记 u=nm,v=nmaxai,答案为:

(u+vv)(u+vv1)

需要一些方法判断前缀是否合法,这个是容易的。

T2 太空沙

首先添加超源超汇并且令其不会被删除使图弱连通,不影响答案,并且入度/出度为 0 的点唯一了。

先对这个拓扑图跑一个拓扑序,点 i 的拓扑序为 pi。然后记录超源到点 i 的最长距离 fi,点 i 到超汇的最长距离 gi

对于一条边 uv,删去拓扑序在 [pu+1,pv1] 的点不影响经过这条边的最长路径,这条路径的长度为 fu+gv+1

那么问题变成了区间取 max 全局求 min,线段树维护即可。

T3 亦爱门优

先考虑暴力判断一个子段是否合法。令星星的维数从 0 编号。

枚举 0k1 的排列 ppi 表示现在已经确定了点 P 的第 p0,p1,,pi1 维,如果当前星星加入后不合法,就用这个星星的第 pi 维来确定点 P 的第 pi 维。

如果所有星星都能够被加入,那么这个子段合法。这样可以做到 O(n2k!)

然后考虑 DP。从第 i 颗星星开始用排列 p 进行匹配,定义 fi,p,j 表示点 P 的第 pj 维第一次发生失配的位置(失配位置同时表示第 pj+1 维第一次进行匹配的位置)。那么使用 p 匹配,以 i 为左端点最长的合法子段为 [i,fi,p,k11]

对这个 DP 进行转移,不妨考虑从后往前走,分类讨论。

如果 fi+1,pp0 满足星星 ii+1 的第 p0 维相同,那无需对 p 做任何调整。

否则我们要在 p 的基础上找到另一个排列 q,让 fi+1,q 转移到 fi,p

注意到我们一定会将点 P 的第 p0 维确定为第 i 个星星的第 p0 维。不妨将 p 记作 [p0]AB,那么 q 就是 A[p0]BB 可以为空)。qp 的变化相当于提前使用第 p0 维进行匹配,如果 q 中第一次使用第 p0 维的星星和星星 i 的第 p0 维相同就可以把 q 中的 p0 提前成为 p

那么枚举所有的 qp0 越靠前一定越优。时间复杂度 O(nk!)

T4 锐

分出来的若干段中,一定只有一段贡献的是段内最长不降子序列长度,其他贡献的是零或一的数量。这样可以得到 O(2nn) 的做法。

暴力枚举所有划分方案其实很搞笑,可以直接做 DP。定义 fi,j,0/1 表示前 i 个数分成了 j 段,是否有贡献段内最长不降子序列长度的子段,可以得到 O(n3) 的做法。

每次扩展一段的 DP 做法其实也很搞笑,我们再加一维 0/1 表示当前这个新扩展的子段要选的是 0 还是 1,这样每次只需要扩展一个位置而不是扩展一个子段了,这是 O(n2) 的做法。

接下来是正解。注意到段内最长不降子序列长度这个贡献可以看成一个只贡献 0 和一个只贡献 1 个数的两个子段的贡献,那问题被转化为如下形式:选出一个尽量长的子序列,使得其连续段数不超过 k+1,这子序列的长度就是划分 k 段时的答案(这是因为可能挑出来一段 000111000111000111,但是有贡献的只有一开始的一堆 0 和最后的一堆 1,而这显然可以只看成单挑了两个段产生贡献)。

倒过来考虑,我们要做的其实是将在其中删去一些元素,让未被删去的元素来产生贡献。首先一定不会删除连续的两个,因为它一定不优。当我们将中间的一个元素删除时,它两侧的两个元素会合并为一个新的元素(因为 01 间隔),这样我们进一步完成转化。

不妨让中间的元素价值为 2(因为对于 010/101 段,让他们全部产生贡献需要三次操作,但是只让两端产生贡献只用一次操作),边上的元素价值为 1(同理)。要选择一些价值和为 p 的元素,要求它们两两不相邻,且长度之和最小。讨论边上的元素是否删除后,剩下的问题是一个反悔贪心的问题,可以用堆维护。

当然证明了凸性也可以直接用闵可夫斯基和优化 O(n2) 的算法。

作者:dcytrl

出处:https://www.cnblogs.com/dcytrl/p/18407188

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   dcytrl  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
点击右上角即可分享
微信分享提示