【题解】P10627 [JOI Open 2024] 中暑
前置:https://www.luogu.com.cn/article/mg96f76c (即 https://s3-ap-northeast-1.amazonaws.com/data.cms.ioi-jp.org/open-2024/heat/2024-open-heat-sol-en.pdf 的翻译)
-
算法一:
定义 \(f_{i,j,k}\) 表示第 \(i\) 条路上,送往第 \(i+1\) 个医院有 \(j\) 个人,第 \(i+1\) 个医院在 \(k\) 时刻爆满,当 \(k=n+1\) 时表示永远装不满。
对于 \(f_{i,j,k}\),枚举下一个转移状态 \(f_{i+1,j',k'}\),定义 \(x=\) 第 \(i+1\) 条路上 \([1,\max(k,k')]\) 中的人数:
-
往第 \(i+2\) 个医院送的有 \(j'\) 个,往第 \(i+1\) 个医院送的就有 \(x-j'+j\) 个。
-
若 \(k\neq n+1\):
满足 \(x-j'+j = c_{i+1}\),解得 \(j'=-c_{i+1}+j+x\)。
所以 \(f_{i+1,j',k'}=f_{i,j,k}+\) 第 \(i\) 条路上 \([max(k,k')+1,+\infin]\) 的人数。
-
若 \(k=n+1\):
满足 \(x-j'+j<c_{i+1}\),\(f_{i+1,j',k'}=f_{i,j,k}\)。
时间复杂度 \(O(n^3)\)。
-
-
算法二:
注意到 \(\sum j=O(n)\),所以状态数应该是是 \(O(n^2)\)。考虑拆开那个 \(x\)。
-
当 \(k< k'\):
即 \(j'=\) 第 \(i+1\) 条路上 \([1,k']\) 时刻的人数 \(+j-c_{i+1}\),\(f_{i+1,j',k'}=f_{i,j,k}+\) 第 \(i\) 条路上 \([k'+1,+\infin]\) 的人数。
此时 \(j=j'-\) 第 \(i+1\) 条路上 \([1,k']\) 时刻的人数 \(+c_{i+1}\)。
此时按照 \(k'\) 从小往大枚举,定义 \(l\) 表示第 \(i+1\) 条路上 \([1,k']\) 时刻的人数,则有转移:\(f_{i+1,j',k'}=\displaystyle \max_{j=j'-l+c_{i+1},k<k'} f_{i,j,k}+\) 第 \(i\) 条路上 \([k'+1,+\infin]\) 的人数。定义 \(g_{i,j,k}=\displaystyle \max_{k'<k} f_{i,j,k'}\) 即可。
-
当 \(k'\le k \le n\) :
即 \(j'=\) 第 \(i+1\) 条路上 \([1,k]\) 时刻的人数 \(+j-c_{i+1}\),\(f_{i+1,j',k'}=f_{i,j,k}+\) 第 \(i\) 条路上 \([k+1,+\infin]\) 的人数。
此时 \(j=j'-\) 第 \(i+1\) 条路上 \([1,k]\) 时刻的人数 \(+c_{i+1}\)。
此时按照 \(k'\) 从大往小枚举,定义 \(h_{i,j+第i+1条路上[1,k]时刻的人数,k}\leftarrow f_{i,j,k}\),\(l_{i,j,k}=\displaystyle \max_{k'\ge k} h_{i,j,k'}\)。
-
当 \(k=n+1\):
满足 \(x-j'+j<c_{i+1}\),\(f_{i+1,j',k'}=f_{i,j,k}\)。
于是 \(j'>第i条路上 [1,+\infin]的人数 +j-c_{i+1}\),\(f_{i+1,j',k'}=\displaystyle \max _{j<j'+第i条路上的总人数-j'+c_{i+1}}f_{i,j,n+1}\),定义 \(q_{i,j}=\max_{j'<j} f_{i,'j,n+1}\),即可
伪掉的思路:
-
当 \(k< k' \wedge k\neq n+1\):
即 \(j'=c_{i+1}-j-k'\),\(f_{i+1,c_{i+1}-j-k',k'}=f_{i,j,k}+\) 第 \(i\) 条路上 \([k'+1,+\infin]\) 的人数。
所以转移到的状态满足 \(j'+k'=c_{i+1}-j\)。若按照 \(j'+k'\) 的顺序枚举,每 \(k'\leftarrow k'+1\) 后便多一个 \(f_{i,c_{i+1}-(j'+k'),k'-1}\),最后前缀 \(\max\) 即可。
-
当 \(k'\le k \le n\):
即 \(j'=c_{i+1}-j-k\),\(f_{i+1,c_{i+1}-j-k,k'}=f_{i,j,k}+\) 第 \(i\) 条路上 \([k+1,+\infin]\) 的人数。
所以转移到的状态满足 \(j'-c_{i+1}=-j-k\)。若按照 \(j'\) 的顺序枚举、\(k'\) 的顺序倒序枚举,那么 \(k'\leftarrow k'-1\) 后便多一个满足要求的 \(f_{i,c_{i+1}-k'-j',k'}+\) 第 \(i\) 条路上 \([k'+1,+\infin]\) 的人数,最后前缀 \(\max\) 即可。
-
当 \(k=n+1\) 时:
需要满足 \(n+1\)
-

浙公网安备 33010602011771号