P11037 【MX-X3-T4】「RiOI-4」上课

P11037 【MX-X3-T4】「RiOI-4」上课

本文主要解释不断 +1 的过程如何快速实现的具体流程。

题意

给定正整数 n,qn 个区间 [li,ri]

q 组询问,每次询问给定一个整数 x。在每个区间内选择一个整数 ailiairi),使得所选整数的总和等于 x,并使得选出的 a 序列的方差最小。输出方差最小值,对 998244353 取模。保证存在至少一种合法的选取方案。

输入格式

第一行两个正整数 n,q

接下来的 n 行,每行两个自然数 li,ri

最后 q 行,每行一个整数 x,表示一次询问。保证存在至少一种合法的选取方案。

输出格式

q 行,每行一个整数,表示最小方差对 998244353 取模的值。

样例 #1

样例输入 #1

3 3
1 3
2 3
3 5
6
9
11

样例输出 #1

665496236
0
554580197

样例 #2

样例输入 #2

4 3
1 4
11 12
3 9
6 10
21
29
26

样例输出 #2

811073551
811073543
748683272

提示

【样例解释 #1】

询问一方差最小的选择方案为 1,2,3,最小方差为 23,有 665496236×32(mod998244353),故输出 665496236

询问二方差最小的选择方案为 3,3,3,最小方差为 0,有 0×10(mod998244353),故输出 0

询问三方差最小的选择方案为 3,3,5,最小方差为 89,有 554580197×98(mod998244353),故输出 554580197

【数据范围】

本题开启捆绑测试。

子任务 分数 n q 特殊性质
1 9 5 5 ri5
2 13 2×103 2×103 ri2×103
3 16 106 =1
4 25 105 105 ri105
5 37 106 106

对于所有数据,满足 1n,q1060liri106,对于每个 x 保证存在一种合法的方案。

核心

最重要的一个式子,有点类似于高中时学回归方程的时候学过的 Σ(xixi)2Σ(yi2yi)2,其中 Σ(xix)2=Σxi22Σxix+nx2=Σxi22nx2+nx2,也就是 Σxi2nx2

所以本题中的方差可以变成 Σxi2nx2 ,对于每一个询问的 x2 是固定的,所以要最小化的就是平方和 Σxi2 ,为了达到这个目的很显然的一个贪心就是让所有 ai 取最小值 li ,设此时他们的和为 S0 ,那么我们还剩下 xS0 的数值要分配给这些 ai ,那么只用把 xS0 依次分配给最小的 ai 即可。

注意这里可能有理解上的偏差,并不能在排序过后按照 l1,l2...ln 的顺序依次将他们变成 r1,r2...rn ,直到不能操作为止,因为每次 +1 之后最小值都有可能变化;而是取出每次给最小值 amin 加上 1 之后的序列中的最小值 amin 循环地动态进行该操作,否则你就只能在 subtask1 上 AC 两个点。

按照该过程手玩一下样例就会发现这实际上类似于一个倒水的过程,拿样例一举个例子的话(红线为初始值),可以具象为如下模型:

1

现在如果倒水进去,把最高液面的高度变为 4 ,也就相当于对 ai 们进行若干次操作后使得 maxai=4,就会变成这样 :

2

其中我们花费的代价为 4 ,也就是 4 个红格子。

那在这个问题中,我们一共需要花费的代价是 xS0 ,很显然的是这个最后的最高高度是具有单调性的,也就是说总是存在一个 h ,使得在花费完 xS0 的代价后,最高液面 (最大的 ai )能够达到 h ,但无法达到 h+1 。(注意最高一层的液面不一定都能恰好取到最大值,因为“液面”高度是用整数而不是小数来衡量的,比如下图这种 xS0=5 的情况) ,所以可以采取二分。

3

至于在二分内部的判断方式,我们可以定义一个 sum[h] 数组,表示将所有 li 提高到 min(h,ri) 的代价,可以想到维护 sum[h] 数组的方式就是根据 [li,ri] 依次在 sum[h] 内进行区间内每个数 +1 的操作 ,最后算出每个位置对应的值,再前缀和即可,可以在读入的时候就维护差分数组,再做两次前缀和的方式实现,不会的话请移步 P2367 。

统计答案

显然是不能够暴力枚举的,思考一下发现,如果我们现在算出了最大高度为 h

​ 对于 ri<h 的所有(显而易见,不可取等)区间 :其对应的 ai 必取 ri ,对答案的贡献为 ri2

​ 对于 hli 的所有(显而易见,可以取等)区间:其对应的 ai 必取 li ,贡献为 li2

​ 对于其他的所有区间:

​ 其 ai 的可能取值为 hh1 ,有 sum[h](xS0)h1(xS0)sum[h1]h,可以 O(1) 地统计。

前两种情况可以定义 Rans[h] 为高度为 h 时,Σiri<hri2Lans[h] 亦是如此。

由于一个 ri 可以对所有比它大的高度产生贡献,符合区间加的特性,所以同样可以用差分的方式预处理求出。

小细节

涉及到逆元的最好开个 longlong ,尤其是在模数比较大的情况下,任何可能会爆的地方最好都取个模。

然后由于 sum,Lans,Rans 的下标都对应的是高度而不是编号 ,所以枚举的时候应该是从 LminRmax

Code

代码仅供参考,有些小地方的实现可能不同,不过不影响。

posted @   Hanggoash  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
动态线条
动态线条end
点击右上角即可分享
微信分享提示