QOJ8085 Bulbasaur

题意简述

给定一个 \(n\) 层,每层 \(k\) 个点的分层图,每一层向下一层连有一些边。记 \(f(l,r)\) 表示最多能选的路径条数,满足这些路径起点为 \(l\) 层,终点为 \(r\) 层,且互不相交(不包含相同的点)。求 \(\sum_{i=1}^n\sum_{j=i+1}^n f(i,j)\)

\(2\le n\le 4\times 10^4,1\le k\le 9\)

题解

容易想到网络流。考虑将每个点拆开,中间连一条流量为 \(1\) 的边,即所有第 \(2i-1\) 层的点向 \(2i\) 层对应的点连边,则 \(f(i,j)\) 即为第 \(2i-1\) 层到第 \(2j\) 层的最大流。

先考虑怎么快速计算 \(\sum_{i=2}^n f(1,i)\)。每次从第一层开始推流,推到能到达的层数最大的层,由于第一层一定能推到第二层,恰好有 \(k\) 条流。记这些流的长度为 \(l_1,\dots,l_k\),则 \(f(1,i)=\sum_{j=1}^k [l_j\ge 2i]\)\(\sum_{i=2}^n f(1,i)=\sum_{i=1}^k \lfloor\frac{l_i-2}{2}\rfloor\)

接下来不断地删掉最左边的层,考虑维护这 \(k\) 条流。当一条流被完全删除时,从当前层重新开始向右推一条尽量长的流,可以证明这样推得的流是正确的。记向右推到的曾为 \(r\),则一次推流的时间复杂度为 \(\mathcal O((r-l)k^2)\)

于是总时间复杂度为 \(\mathcal O(nk^3)\),用压位优化可以做到 \(\mathcal O(nk^2)\)

posted @ 2025-10-30 14:59  zifanwang  阅读(1)  评论(0)    收藏  举报