T1
https://jzoj.net/senior/#main/show/1669
暴力你可以考虑费用流或者KM。
考虑一种贪心是按照权值从大到小排序,每次加进去时把之前加入过的拉出来排序判断是否可以加入。具体可以用一个堆来维护。基于这样的贪心是显然正确的。
时间复杂度有一个log,且常数很大,考虑优化。
引入“活跃点”,可以把所有区间按照 l l l第一关键字, r r r第二关键字进行排序,每次令 x = m a x ( x + 1 , l i ) x=max(x+1,l_i) x=max(x+1,li),一个新 x x x就是一个活跃点。则最后被选中的点一定是在活跃点这个集合中。证略。
于是我们可以类似上面的贪心,先按权值排序,然后再考虑 贪心 + 匈牙利 的方式。对于一个区间,我们先从它能包括的最小的活跃点开始搜,然后依次匹配。但这样的时间复杂度依然比较大。
继续优化,可以发现,如果你想把另外一个点给匹配掉,那么另外一个点对应的 r r r要比当前点的 r r r要远,否则你不必匹配,只需找下一个活跃点。这样的时间复杂度就很优了。
T2
https://jzoj.net/senior/#main/show/1895
裸的SG函数题。以某点位根的子树的 S G SG SG值是其所能到达所有后继局面的 S G SG SG值的 m e x mex mex。对每个点求出它能到达的后继局面的 S G SG SG值。则一个点的 S G SG SG可以由其儿子的后继局面转移过来。
树高有限制,所以是 O ( n L ) O(nL) O(nL)的。
T3
https://jzoj.net/senior/#main/show/1656
考虑一条链的做法,可以由一个点向其跳跃点连一条长度为 1 1 1的边,以及其前后连一条长度为 1 1 1的边,只需注意 1 1 1不能向 2 2 2连边,然后BFS即可。
转化到树上,可以看出其实长度变为深度而已。那么处理出BFS序,发现一个点能跳跃到的点是BFS上的一段连续区间,于是可以很容易的求出它的连续区间的起点,然后并查集一下即可。
T4
https://jzoj.net/senior/#main/show/1897
考虑从上往下放。每次必然是把这本书的右端点放在之前所有书的重心处。问题变成求调和级数。
有这样一个式子 lim n → ∞ ∑ i = 1 n 1 i = ln ( n + 1 ) + γ \lim\limits_{n\to\infty}\sum\limits_{i=1}^n\frac{1}{i}=\ln{(n+1)}+γ n→∞limi=1∑ni1=ln(n+1)+γ
其中 γ γ γ是欧拉常数,约等于0.5772156649。
它的严格定义是这样的
于是有
∑
i
=
1
n
1
i
=
∫
1
n
+
1
1
[
x
]
d
x
=
∫
1
n
+
1
1
x
+
∫
1
n
+
1
(
1
[
x
]
−
1
x
)
=
l
n
(
n
+
1
)
+
γ
\sum_{i=1}^n\frac{1}{i}=∫_1^{n+1}\frac{1}{[x]}dx=∫_1^{n+1}\frac{1}{x}+∫_{1}^{n+1}(\frac{1}{[x]}-\frac{1}{x})=ln(n+1)+γ
i=1∑ni1=∫1n+1[x]1dx=∫1n+1x1+∫1n+1([x]1−x1)=ln(n+1)+γ
然后考虑如何近似求 γ γ γ,可以直接根据它的定义式,每次把 x + 0.0001 x+0.0001 x+0.0001保证精度。
T5
https://jzoj.net/senior/#main/show/1898
容斥,然后把矩阵乘法改成DP倍增即可。
T6
https://jzoj.net/senior/#main/show/3538
费用流 或 KM + 三分。
KM要加slack优化,不然T飞的。
T7
因为直接推带着个无穷级数,不妨先不考虑。
考虑每个点受到的总伤害,于是一个点的总伤害总会转移给它能转移的点,这样列出方程就可以求出来总伤害。然后考虑最后乘上它能转移出去的伤害就可以了。因为这是总伤害了,所以可以直接算出来它转移之后还剩百分之多少,乘上即可。