0%

20250206 部分作业

好多题,不嘻嘻。

只保留了我认为比较有意义的题。

QOJ9540 Double 11

题意

现在有 个物品,每一个物品有一个销量

你现在需要将所有物品分为 组,设 为第 个物品分到了哪一组。

现在需要对每一组选出一个非负实数权值 ,满足

在此条件下,需要让 最小,求出这个最小值开根后的结果。

题解

考虑若已经确定了分组的方案,如何确定最优的

设第 组物品共有 个,他们的 之和为

根据柯西不等式,有

那么可以得到

而题目需要我们求出最小值开根后的结果,也就是

假设我们现在已经固定了 的取值,如何进行分组。

那么此时可以发现,将初始的 排好序之后,一组物品一定在一个区间内,以分为两组进行举例。

假设两组分别有 个,所有物品总销量为 ,那么代价为

不难发现, 是下凸的,也就是说某个区间的最小值在两个端点处取到。

也就是说,第一组物品销量和应该尽可能小或者尽可能大。

那么第一组物品一定是所有物品中最左边的 个或最右边的 个,这自然是一个区间。

这样我们就证明了,同一组的物品一定在一个区间内。


考虑暴力,设 表示前 个物品分为 组的最小方案。

,那么有

这里应该有一个证明,但我不会证

这样我们就证明了 是满足四边形不等式的,也就是说 是一个蒙日矩阵。

原题相当于在蒙日矩阵上做最短路,要求恰好走 条边。

那么直接 wqs 二分然后二分栈优化 dp,时间复杂度是

提交记录

QOJ9737 Let's Go! New Adventure

题意

游戏中有 个怪物,你可以创建若干个账号刷怪。

一个怪只能被打一次,一个账号打的所有怪,编号必须是一个完整的区间。

个怪可以提供 的经验值。游戏的满级是 级,从 级升到 级需要 的经验值。

一个账号带来的收益是他的等级减去一个常数 ,求所有账号收益和的最大值。

,保证

题解

首先令 ,这样就可以忽略等级只有 种。

的前缀和, 的前缀和。

表示如果打怪总共获得了 的经验,足够升到多少级。

由于 递增,那么容易发现 是凸的。

考虑列出 dp 方程, 表示当前打了前 个怪,最大总收益是多少。 又变成了蒙日矩阵上的最短路问题(实际上是最长路(对。

时间复杂度 ,后面的 来自求 的二分。

提交记录

似乎可以优化到单 ,但我没太懂

ABC383G Bar Cover

题意

现在有 个数字,第 个数字是 。还给定了一个数字

对于一个数字 ,你需要选出 个长为 的互不相交的区间,一个方案的权值是被覆盖的所有数字的和。

对于每一个 ,求出最大的权值。

题解

,那么问题相当于从 中选择 个数字,满足选中的位置下标至少差了

考虑暴力 dp,设 表示前 个数字中选出了 个,上一个选中的数字和 的位置差 ,最大的权值和。

那么 dp 值关于 这一维应当是凸的,也就是说可以使用闵可夫斯基和 进行合并。

考虑从 转移到 的过程,相当于乘上了一个 的矩阵,矩阵中每个元素都是一个凸的函数。

分治求出 的矩阵,时间复杂度

CF1787H Codeforces Scoreboard

题意

现在有 道题,你每一分钟可以提交一道题,同一道题目只能提交一遍。

如果第 分钟提交了第 个题目,将会获得 的分数。

求最多能获得多少分。

题解

假设所有题目初始会有 的分数贡献,然后提交会获得 的分数。

显然,如果 取到 那还不如不提交,也就是说可以直接假设可以获得 的分数。

后面和这个一样,平衡树解决。

时间复杂度

CF1534G A New Beginning

题意

平面上有 个点,第 个坐标为

你初始在平面的 上,每一次可以向右或向上走一步。

若你当前在点 ,则激活一个点 的代价为

求激活所有 个点的最小代价和。

题解

考虑激活一个点的代价是当前位置与那个点的切比雪夫距离。

那么我们应该只会在走到 的时候激活 这个点。

表示当前走到了 这个坐标,最小代价是多少。

转移分为两种,第一种是向右或向上走一步,方程为

第二种是激活一个点 ,那么相当于给整个 加上

考虑维护 dp 值的差分的差分。

由于一次 操作只会给差分的差分带来 的变化,所以我们维护差分的差分每一个 的位置。

(也就是说如果 ,那么我们维护序列 )。

现在考虑两种操作怎么维护。

第一种操作相当于是给原来函数谷值右边的部分往右平移一个位置。

也就是说,将维护序列的后半部分,整体

第二种操作相当于是给某个位置的差分的差分加上

相当于是给序列中插入两个相同的数字。

使用对顶堆维护即可。

时间复杂度

提交记录

QOJ8362 game

题意

现在有 个怪物,打败第 个怪物会掉 点体力,打完之后会获得 点体力。

任何时候你的体力值不能是负数。

对于每一个 求出,现在需要打至少 只怪物,初始体力值最少是多少。

好像这题的样例输出 1 是错的,然后输入格式是对的。

题解

先考虑,如果我们已经确定了初始的体力值,我们如何确定怪能否全部打完。

相当于是确定一个打怪的顺序。

首先可以知道,一定是先打 的怪,再打 的怪。

为什么呢,假设存在一个 ,并且其后有一个 满足

我们不妨设 为最小的这样的 ,则对于任意 都有

那么我们将打怪物 的时机调到 的前面一个,其他顺序不变,可以发现这样打每一只怪物的初始体力都不劣于之前。

所以至少存在一个合法的方案,先打了所有 的怪物,再打了所有 的怪物。


对于 的部分,因为我们的体力会越打越多,所以肯定是按照 从小到大的顺序去打。

对于 的部分,不难发现我们其实可以知道所有怪物打完之后的最终体力值(如果能打完的话)。

那么这部分和上面那部分应该是对称的,也就是说这部分应该按照 从大到小的顺序去打。

这样我们就确定了一个打怪的顺序出来。


那么来思考第一部分。

由于第一部分我们是按照 从小到大的顺序去打的。

那么可以发现,我们一定是打了一个前缀的所有怪物(因为如果某一个怪物打不了,后面的所有怪物就都打不了)。

我们容易预处理出,如果第一部分要打 个怪物,那么最小的初始体力值是多少,以及中间过程体力值会变化多少。

假设我们能够算出,在第二部分中,打 个怪物需要多少的初始体力,那么直接双指针一下,问题就解决了。

所以本题难点在于第二部分。


对于第二部分,我们已经知道了打怪的顺序,那么就可以先看看暴力。

表示 这些怪物中,需要打 个怪物,最小初始体力值是多少。

那么有方程

考虑 会说明什么事情。

对于任意的 ,可以发现会有

这说明 的值永远不会再变化了,这是一个很棒的性质。

表示最大的 满足 。那么: 容易发现,对于 的部分,相当于是 这个数列做 卷积,得到

由于它们都是凸的,所以这可以直接闵可夫斯基和优化。

值得注意的事情是, 也是需要转移的,我们这个时候可以把 当作 来弄。

时间复杂度

提交记录

GYM103202L Forged in the Barrens

题意

给定 个数字,对于每一个 求出将整个序列划分为 段,每一段极差之和的最大值。

题解

和上面那个 ABC 基本一样。都是区间分治一下维护矩阵。

直接做状态是 ,分别表示这个区间有没有选定最小值和最大值。

这样直接做可能会寄,考虑如果一个区间同时选定了最小值和最大值,我们直接强行让这个区间结束。

这样就只需要记 三种状态,复杂度 ,其中

GYM102586B Evacuation

题意

现在有 一共 个城市,第 个城市有一个避难所,容量为

如果第 个城镇没有遭遇陨石袭击,那么可以容纳 的人,否则可以容纳 个人。

现在一共有 个人在同一个城市,具体在哪个城市并不确定,和 组询问。

组询问给定 ,现在 的城市遭遇了陨石袭击,问最劣情况下人员迁走的代价,每一个人每走一步代价为

题解

首先可以知道,这 个人初始位置肯定在 中间,不然就不用搬走了。

考虑如果已经确定了初始位置,如何知道答案。

所有人应该都优先往两边最近的避难所走,所以二分一下然后前缀和瞎算一下就对了。

容易发现,一个询问中,当所有人初始点在区间左半边某个点的时候,区间右端点在哪里不影响答案,因为左端点左边的位置可以放下所有人。

同理,区间右半边也是一样的。

所以考虑对两种情况分类讨论,考虑求出起始点在区间右半边的最劣情况。

为所有人起始点在 ,区间右端点在 ,最大的答案是多少。

考虑 是多少。

,那么

同时还有

可以推出

,则可以知道 ,可以得出相同的结论。

移项可以知道

也就是说 是满足四边形不等式的。

而我们求的相当于

考虑将所有询问离线,然后建一棵线段树,将所有询问挂到对应的区间上。

然后对于一个区间来说,每一行是这个区间里面的一个点,每一列是挂在这个区间上的询问。

然后我们对这个询问跑分治,就能跑出所有询问的答案。

时间复杂度是