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