前言
你要搞清楚自己人生的剧本不是你父母的续集,不是你子女的前传,更不是你朋友的外篇。
第三次考试,第二次被我咕掉了。
,在高二没参考的情况下,,也还算能看。
感觉这次的排名和上次是倒过来的。
T1 这么唐氏的 DP 状态有限,是可过的,居然被我直接否定掉了,我还是太愚蠢了。
最开始只会 的位运算优化的爆搜,在一系列乱搞和剪枝下居然过掉了 的数据,这辈子也就只会乱搞了。
考虑一个更有优化前景的暴力 DP。即我们定义 表示前 个数选的子序列集合为 ,对应的最大逆序对数和方案。复杂度应该是 。
但是显然,如果我们把所有的状态都记下来,显得有些冗余,因为有些对我们后面的逆序对影响不大。
假设 后面的数是 ,(不妨设 ,其实我们只关心 在前 个中每段被选了多少个。于是状态数不会超过每段长度 的乘积。
此时状态应该被减下去很多了,你写完之后发现可以通过。具体证明的话,可以使用柯西不等式,一定会在每段相同的时候取到状态数量的最大值,通过求导得到最值是 ,由于段长是整数,时间复杂度应该就是 。
可能使用 类的东西来暴力压状态会被卡常,可能需要实现精细一点。
貌似还有很多其他奇奇怪怪的做法(?
感觉是一道挺不错的题,确实没想到这个地方可以使用分治来减小复杂度。
从 一个一个来。
先看 的时候,其实答案就是算每个点的贡献,即 。
然后看 的时候怎么办。
发现一个性质,即从 的路径,假设 ,那么显然可以发现我们在路径中必然不存在从 这种向左走的情况。证明应该是显然的,因为是点权最短路。
考虑一个分治。对于分治区间 ,我们统计所有 这样的所有 这样的点对的答案。对于剩下的直接递归处理。
发现其实我们只需要关心 这一列是怎么走到 这一列去的。
考虑求出 到列区间所有点的最短路。假设分别是 和 。
对于 且要在当前递归中被计算的点对,发现当 时,从 到 列时,我们是从第一行走的,否则就是第二行。
我们将上述不等式化成如下形式: ,应该在分治中就可以转化成一个一维偏序问题,对于从第一行和第二行分别统计答案即可。
时间复杂度 。
接下来看 怎么处理。
发现 是可能向左走的。但是发现从 且 的情况下,我们只有可能在起点处向左走若干步,中间一直向右,最后再向左走若干步到达终点。
这意味着什么呢,在递归区间中, 可能经过的点不只是递归区间中的点,而是从左边走 型拐进来的。
也就是说,我们只需要考虑从 走到 可能不是直接一列走下去,而是向左走一个 型 或者向右走一个 型。然后把这种 型考虑到最短路求完之后。(因为为了保证复杂度,最短路不能经过递归区间外的点,就必须强行考虑 这种走出区间的情况。)从 的情况都需要预处理,而且预处理应该是比较平凡的。
然后求出区间内所有的点到 的最短路之后,刚才判断从 到 列是走的是哪一行就变成了 ,从而从一维偏序变成了二位偏序。然后由于你算的所有点对,这里的小于和小于等于的符号一定要想清楚,不然很容易算重。就你在从第一行和第二行过去都算到了同一个点对。
时间复杂度仍然是 。
代码非常恶心,长达 ,仅供参考。
以前做过,差点没想到决策单调性,险些没做出来。。。
首先有一个很显然的性质,对于所有重量为 的苹果,我们把这些苹果按照价格从大到小排序之后,如果重量为 的苹果被选择了 个,那么一定是选的苹果价值最大的 个。
于是我们考虑把 分别拎出来,每组苹果按照价值从大到小排序之后求一个前缀和。
然后考虑一个朴素背包 DP。定义 表示考虑完重量为 的所有苹果之后,当前运输了重量为 的苹果时,可以最多卖出多少价钱。
显然有转移 ,其中 表示重量为 的苹果有多少个, 数组是当前重量为 的苹果排序之后的价值前缀和数组。
发现 在排完序之后,所连成直线构成的图形应该是上凸的,这指向了决策单调。
发现 只会从 转移得到,也就是说 。
发现对于所有的 在模 的意义下分成 组,只有每组内部才可能产生转移,并且发现每个组内的转移由于 是上凸的,所有每组内的转移满足决策单调性。
然后直接整体二分维护决策单调即可,
时间复杂度 。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探