【六省联考2017】寿司餐厅

Description

  给 \(n\) 种寿司,第 \(i\) 种寿司的代号是 \(a_i\)
  可以选择任意多个形如 \((L,R)\space |\space L\le R\) 的区间,所有满足 \(L\le l\le r\le R\)\(d_{l,r}\) 会被累加进答案,所有满足 \(L\le x\le R\)\(a_x\) 会被累减进答案。每个 \(d_{l,r}\) 只能被累加一次,即被覆盖一次后再覆盖不累加;每个 \(a_x\) 可以被多次累减,但同一个 \(x\) 最多使 \(a_i\) 被累减一次(即对应原题中“吃过了 \(c\) 代号为 \(x\) 的寿司”)。
  对于 \(i = 1\cdots n\),若 \(a_i\) 被累加过至少一次,则答案再累减 \(m a_i^2\)
  求答案的最大值。
  数据范围见原题

Solution

前置知识:最大权闭合子图

  自己看着学吧
  为什么求最小割呢?感性理解不难证明:设 S 所在的点集为选的,T 所在的点集为不选的,我们默认把所有的人都选上,然后考虑把一些人划到 T 集(割掉一条 S 与人之间的连边),把一些活动划到 S 集(割掉一些 T 与活动之间的连边),这两种操作都会使活跃值减少,我们希望使活跃值的减少量最小,那么就是求这张图的最小割了。

本题

  若 \(m=1\),则对每个代号 \(i\) 开个点,点权为 \(i^2\)
  再对每个 \(d_{i,j}\) 开个点,当 \(i=j\) 时,点权为 \(d_{i,i} - a_i\),若 \(m=1\) 则该点向代号 \(a_i\) 对应的点连边;当 \(i≠j\) 时,点权为 \(d_{i,j}\),该点向 \(d_{i+1,j}\)\(d_{i,j-1}\) 对应的点连边。
  这就等于把题目的所有限制 都转化为了“选择 \(x\) 则必须选择 \(y\)”的形式。画成图就是一个 DAG,对于一条边,选择起点就必须选择终点。对这张图求最大权闭合子图即可。
  时间复杂度…… Dinic 求最大流的速度其实很快,因为有分层图和多路增广(费用流就只能单路增广,所以很慢),\(n\) 个点的图求最大流的时间一般不到 \(O(n^2)\),即这题的时间一般不到 \(O(n^4)\),实测最大点可以跑几十 ms……(玄学网络流)
  (我第一次写了个单路增广,最大点开 O2 跑了近1s,不开 O2 直接 T 了…… 有点恐怖)

  code

posted @ 2019-10-14 17:44  大本营  阅读(130)  评论(0编辑  收藏  举报