前言:主要练了一些最短路,网络流,数据结构优化建图,感性理解了二分图 HallHallHall 定理
HDU 5503
有 N(N≤50000)N(N≤50000)N(N≤50000) 支球队,每两支球队之间都会有一场比赛,没场比赛胜利记1分否则记0分,给出这N支球队的分数,问能否构造出每场比赛的结果,使得最后的分数成立?
解:首先可以球队向原点连 aia_iai 的边,比赛向两个球队连边,跑网络流看合不合法
考虑将一个球队拆成 aia_iai 个点,比赛依次连边,将比赛作为 XXX 集合,球队作为 YYY 集合
当且仅当存在完美匹配时数据合法
根据二分图 HallHallHall 定理,XXX 中的任意 kkk 个点,与 YYY 中的点至少有 kkk 对联通时存在完美匹配
我们可以枚举 YYY 中的 k 个球队,那么在 XXX 中会有 (k2)\binom{k}{2}(2k) 个点
那么对于这 kkk 个点,需要满足 ∑i=1kai≥(k2)\sum_{i=1}^k a_i\ge \binom{k}{2}∑i=1kai≥(2k) ,于是排序取最小的 aia_iai 即可
POJ 3613
floyedfloyedfloyed 快速幂,最开始的矩阵表示 xxx 到 yyy 经过一条边的最短距离,乘一次就相当于多走了一条边
BZOJ 3693
应该规到数据结构,但写都写了就算了
首先可以暴力 n2n^2n2 建图判一下有没有完美匹配
根据二分图 HallHallHall 定理,对于任意区间 [L,R][L,R][L,R] 如果对包涵的区间的 aia_iai 求和
需满足 R−L+1≥sumR-L+1\ge sumR−L+1≥sum
显然只有在原区间左右端点上的L,RL,RL,R才有用
于是转换为,对于任意区间 [L,R](L∈lj,R∈ri)[L,R](L\in l_j,R\in r_i)[L,R](L∈lj,R∈ri),需要满足 ∑k=jiak≤R−L+1\sum_{k=j}^i a_k\le R-L+1∑k=jiak≤R−L+1
也就是 R≥sum+L−1R\ge sum+L-1R≥sum+L−1
按 rir_iri 排序,线段树对于每一个 lil_ili 维护 max(sum+L−1)max(sum+L-1)max(sum+L−1)
考虑每次添加一条线段的影响,对于 l≤lil\le l_il≤li 的 lll 有 aia_iai 的贡献
线段树区间加,区间 maxmaxmax 即可
BZOJ 2259
题意:一个序列 a1,a2,...,ana_1,a_2,...,a_na1,a2,...,an,每次从 iii 跳到 i+ai+1i+a_i+1i+ai+1,要求刚好跳到 n+1n+1n+1,可以对aia_iai修改,代价为修改的绝对值,问最小代价
完全看不出是最短路…
发现 iii 跳到 i+ai+1i+a_i+1i+ai+1 是免费的,等价于 i−−i+ai+1i -- i+a_i+1i−−i+ai+1,建边权为 0 的边
调整考虑一个一个调整,i+ai+1−−−i+aii+a_i+1 --- i+a_ii+ai+1−−−i+ai 建边权为 1 的边
如果 i+ai+1>ni+a_i+1 > ni+ai+1>n,那么向 n+1n+1n+1 连边权为 i+ai−ni+a_i-ni+ai−n 的边
求出 1 到 n + 1 的最短路即可
没想到最短路也有建模,将代价抽象到边,最短路即是最小代价,妙啊!
BZOJ 2143
挺妙的一道题
考虑我们不直接记录跳到哪,我们到一个点,如果要跳,就给它记一个"能量"
一个能量可以走一格,而要跳等价于能量加上 ai,ja_{i,j}ai,j
考虑如何处理不跳满的情况,发现可以让它自己不动
接下来就有两种做法,一个是每种能量建一层图,就可以无脑分层图
一种是 dpdpdp,fi,j,kf_{i,j,k}fi,j,k 表示到 (i,j)(i,j)(i,j) 能量为 kkk 的最短路,类似 DijsktraDijsktraDijsktra 用堆维护最大转移
枚举每个点为起点跑一次即可
转换的思想特别巧妙
BZOJ 2400
题意:有一些点的点权确定,你需要确定剩余点权,使整个图的权最小,图的权为相邻两点异或和的和
图权最小时需点权和最小
首先位与位是互不干扰的,按位处理
题目转换为,把点分为 0/10/10/1 集合,只有 0 / 1 之间的边有贡献
是一个最小割的模型
令原点为 1 集合,汇点为 0 集合,原点向这一位为 1 的连边,这一位为 0 的连向汇点
边权为 infinfinf,强制不能割
对于原图上的边 (u,v)(u,v)(u,v),连边 (u,v,1)(v,u,1)(u,v,1)(v,u,1)(u,v,1)(v,u,1),表示正反都可以割
求出最小割即是第一问
第二问怎么办,发现这样求出来后与 SSS 联通的已经是最小点集,也就是说 1 的个数最小
从原点开始 dfsdfsdfs 即可
UOJ 77
好题
首先,分配黑白,应该是最小割的模型
考虑先令答案为 ∑(bi+wi)\sum (b_i+w_i)∑(bi+wi),要让减去最小割为答案
原点向每个点连边,边权为 bib_ibi,如果割掉表示选白,此时不需要考虑为黑的限制
每个点向汇点连边,边权为 wiw_iwi,如果割掉表示选黑,此时要考虑限制
限制为对于任何满足条件的 jjj,jjj 如果要选白,也就是割黑,就要额外付出 pip_ipi 的代价
最小割建图的一个经典模型就是连一些为 infinfinf 的边强制选 / 不选
你要割黑是吧,老子让你只有割了黑就必须割 pip_ipi,否则就让你娃跟汇点联通
容易想到先建一个虚点 i′i'i′,iii 向 i′i'i′ 连边权为 pip_ipi 的边
你割黑就让你联通,等价于从 i 走到 j 走出一条增广路,i′i'i′ 向 jjj 连 infinfinf 的边即可
观察题目限制,想到主席树优化建图
有一个坑点是一个权值有多个点,主席树上的点要向这些点连边
我们不暴力连,向上一个叶子连即可
HDU 5420
想到了一道类似的题,不记得出处了
就是按深度建主席树,然后向 dfsdfsdfs 序区间 [inu,outu][in_u, out_u][inu,outu] 连边
因为 [inu,outu][in_u, out_u][inu,outu] 中没有在 u 之上的点,所以是对的
然后就是主席树优化建图,边数点数都是 nlognnlognnlogn
NOI 2009 植物大战僵尸
最大权闭合子图模型
关于最大权闭合子图,就是说你选了一个点,它能到达的都必须选,问选出来的子图最大是多少
原点向点权为正的连边,点权为负的向汇点连边,边权为绝对值,原图上的边边权为 infinfinf,表示割不掉
点权为正的点权和 - 最小割即为答案,因为要么割正的,要么割负的,割正的表示不选这个点,要减掉
割负的表示选了这个点,同样要剪掉它的值
这道题就是这样一个模型,因为要打死一个植物,必须打死保护它的植物
有一个问题就是当存在环时,环和环保护的点是打不死的,于是可以将网络流的图反过来拓扑排序,只建标记的点即可
BZOJ 2654
已经玩烂的经典题
类似 dpdpdp 凸优化,可以将白边加上一个值,判断最后选出来的个数
如果多了,就把加的调小,小了就把加的调大,最后的答案就是生成树权值 -
有一个坑点:权值相同时优先选白边