QOJ 4215 Easiest Sum

QOJ 4215 Easiest Sum

前言

  • 智慧不够 冤枉题解
  • 仅以楼下 表我之无能
  • /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)  评论(1)    收藏  举报