前言
- 智慧不够 冤枉题解
- 仅以楼下 表我之无能
- /bx ps rj
题目描述
- 对于序列 \(a\),每次操作将一个数减小 \(1\)。
- 令 \(f(k)\) 表示进行 \(k\) 表示进行 k 次操作后序列的最大子段和最小能达到多少。
- 给定 \(a,K\) 计算 \(\sum_{k=1}^Kf(k)\),答案对 \(998244353\) 取模。
- \(n\le 10^5,K\le 10^{13}\)
题解
- 观察,我们迫切的希望减小一个数会使得,最大字段和减一,在任意时刻会有 \(x\) 个不交的极小段,且每一段都为最大字段,我们想把最大字段减小1,需要 \(x\) 次操作,而当 \(k\) 无限大时,进行 \(k\) 次操作后,\(x\) 会变成 \(n\)。于是 \(x\) 是一个不断增大到 \(n\) 的东西。
- 这里好像有单调性,把 \(K\) 划分成 \(n\) 段,每段贡献为等差数列的形式,重点在于一种确定操作 \(K\) 次后的 \(x\) 是多少。这这这,太困难我不会。
- 额,然后就是题解说的,不妨把问题转化为给定 \(x\),求最小的 \(k\) 使得 \(f(k)\le x\)
- 诶,这有什么好处,由上文 \((x,f(k))\) 最为座标放在平面中,斜率就是上文的 \(x\),所以成凸性,左下凸壳。用数学方法容易计算答案。
- 那么给定 \(x\) 怎么求 \(k\) 呢?
- 设 \(dp_{i}\) 表示考虑的序列的前 \(i\) 个数需要的最小的操作次数,答案就是 \(dp_n\)
- 转移就,\(dp_i=\max\limits_{j=0}^{i-1}\{dp_j+\sum\limits_{k=j+1}^{i}a_k-x\}\),这里为什么对呢?万一区间 \([l,r]\) 满足小于 \(x\) 后,有区间 \([x,y],x\in[l,r]\) 不满足呢?但是我们有 \([l,y]\) 的贡献,所以不会错。要是独立呢?那更没问题了。
- 上述 dp 说的是什么呢,所有若干不相交区间的权值和减区间个数乘 \(x\)
- 就是 \(k=dp_n=\max\limits_{i=1}^n\{d_i-ix\}\) 其中 \(d_i\) 表示最大 \(k\) 段区间和。
- 那这个怎么求呢?考虑费用流,最大费用,起点向中间点连 \(-x\) 权,中间点向右连 \(a_i\) 的边,然后连向汇点,有费用流,有凸性,于是模拟费用流。
- 线段树每次选取最大子段,并将最大子段的数值取反即可。
- \(k\) 的值相当于若干直线取 \(max\) 相当于左下凸多边形,然后只需二分 \(f(k)\) 的为止,然后一段一段算,\(\text{O(nlogn)}\)
posted @
2025-02-10 08:33
LUHCUH
阅读(
69)
评论()
收藏
举报