【题解】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\)

posted @ 2025-08-15 22:00  GuTongXing  阅读(12)  评论(0)    收藏  举报