大概率是我最后一篇做题记录了…
其实自己真的对自己也没有什么要求了…
week 0
2020.11.01
去jsk打了场信心赛…题目很简单…由于只做了大概 2.5h 导致 只有360(直接垫底)…AK 失败。
不过很幸运的是没有挂题,对我这种菜鸡已经很满足了。
*ARC107D Number of Multisets
这种题目真的非常降智…
首先很容易想到一个
O
(
n
3
)
O(n^3)
O(n3) 的做法,即枚举插入某个数的背包。
理论上这样的 dp 很难能够得到优化,但是这题有一个非常巧妙的性质,即背包的代价成倍数关系且权值无限。
这使得我们可以考虑将方案数转移别的状态计算。
令
f
n
,
k
f_{n,k}
fn,k 为对应所求答案,即:
f
n
,
k
=
f
n
−
1
,
k
−
1
+
f
n
,
2
k
f_{n,k}=f_{n-1,k-1}+f_{n,2k}
fn,k=fn−1,k−1+fn,2k
注意到
k
>
n
k>n
k>n 时
f
n
,
k
=
0
f_{n,k}=0
fn,k=0 .
所以能够做到
O
(
n
2
)
O(n^2)
O(n2) 。
week 1
2020.11.02
ARC107E Mex Mat
真的应该先看这题的,就是个打表题…
打表发现
4
≤
n
4\leq n
4≤n 后,
a
i
,
j
=
a
i
−
1
,
j
−
1
(
i
,
j
≥
4
)
a_{i,j}=a_{i-1,j-1}(i,j ≥ 4)
ai,j=ai−1,j−1(i,j≥4)。
于是变成了模拟题…
ARC107F Sum of Abs
显然是网络流最小割,本题的难点在于如何计算一个连通块代价和的绝对值。
根据
∣
A
∣
=
max
(
A
,
−
A
)
|A|=\max(A,-A)
∣A∣=max(A,−A) ,我们可以知道我们可以将其分成一正一负两种代价来计算,只要我们通过连边使得一个连通块中取的代价的正负性相同即可。
受到上面的启发,我们考虑将图上每一个点
v
v
v 拆成
v
0
,
v
1
v_0,v_1
v0,v1两点,割去
S
−
v
0
S-v_0
S−v0 代价为
−
B
v
-B_v
−Bv,割去
v
1
−
T
v_1-T
v1−T 代价为
B
v
B_v
Bv,割去
v
0
−
v
1
v_0-v_1
v0−v1 ,代价为
A
v
A_v
Av,表示删去这个点。
考虑一条有向边的限制
u
−
>
v
u->v
u−>v ,它的两个端点的情况只有以下两种:
-
u u u 点被删去,另外一个点随意。
-
u u u 点没被删去,另外一个点要么删去要么与其正负性相同。
那么我们只需要增加一条关于
条件2
的边,而这条边就是 u 0 − > v 1 u_0->v_1 u0−>v1 (仔细思考一下)。
不过最大流跑不起负边,我们只需要将每条边增加 ∣ b i ∣ |b_i| ∣bi∣ 即可。
[LOCAL]树和森林(lct)
缝合怪题目…关键是还把简单的一问放在后面,出题人还来各种恶心的障眼法。
先说第二问:其实就是个经典题目,只有一个解或者无解,先确定叶子然后 dfs 上去,最后看一看根是否合法即可。
对于第一问:当然是ctj啦!
2020.11.03
打 ABC 练练手速…D题WA了3发自闭了…
*[LOCAL]数列(seq)
非常偏门的一道题目。
看到数据规模小却只会普通状压/枚举子集,调了半天发现做法假了。
实际上数据规模小还可以搜索+hash记忆化。
比如这道题目,我们可以采用以下方法hash:我们将状态设为一个
8
8
8 进制数,其中 0
表示当前质因子还未使用,1~6
表示当前质因子使用过一次且其在前方的大致分布情况(哪些数和哪些数在一起),7
表示当前质因子已经使用过。这样我们就能够将每个情况不重不漏的表示出来。
理论最坏复杂度:
O
(
2
18
×
2
6
)
=
O
(
2
24
)
O(2^{18}\times 2^6)=O(2^{24})
O(218×26)=O(224)。
实际效率远远小于该理论复杂度。
2020.11.04
[ABC180F]Unbranched
练习一下基础计数题…
大小为
L
L
L 的带标号环个数为
(
L
−
1
)
!
2
\frac{(L-1)!}{2}
2(L−1)!,带标号链的个数为
L
!
2
\frac{L!}{2}
2L! 。
然后我们背包计算即可,计数时需要固定第一个一定时选择当前剩余数中编号最小的数。
注意需要特判
L
=
1
,
2
L=1,2
L=1,2 。
2020.11.05
[已隐藏]
week 2
考完 CSP,坐等退役。
2020.11.14
非常自闭,发着呆基本上一上午就过去了。最后花了 1h 写了写今年 CSP-J 组的题目…
不过确实没有之前听说的那么难…4道都算比较基础的题目…
「CSP-J 2020」表达式(expr)
居然是我之前打算投给 CF 的原题…投题数
−
−
--
−−
主要思想就是模拟求出表达式+一次从根到儿子的 dfs 。
2020.11.15
今天做了一些 Atcoder 的简单题,感觉思维真的僵化了…
ARC075C Meaningful Mean
平均值为
K
K
K 的经典结论就是将每个数减去
K
K
K ,它们的和等于零。
那么求平均值大于等于
K
K
K 的区间用离散化+树状数组统计一下即可。
开着unsigned long long
调了半天。
ARC082D Sandglass
容易发现我们的改变呈现一个 max ( 0 , x − Δ t ) \max(0,x-Δt) max(0,x−Δt)或者 min ( X , x + Δ t ) \min(X,x+Δt) min(X,x+Δt)的形式,我们画一画图就可以发现 ,这个 min \min min和 max \max max 的限制会使 a a a 在任意时刻都会呈现一个梯形的函数,随着 t i t_i ti 的递增维护这个梯形函数即可。
*CF1187D Subarray Sorting
被之前做过的题目给带偏了…
首先一个非常重要的转化:任意长度区间排序等价于交换若干次逆序对。
那么这题的充要条件就是
{
a
}
\{a\}
{a} 到
{
b
}
\{b\}
{b} 序列没有新的逆序对。
而没有新的逆序对的具体含义就是对于
{
b
}
\{b\}
{b} 序列中两个位置
(
i
,
j
)
(
i
<
j
)
(i,j)(i<j)
(i,j)(i<j),设其分别对应
{
a
}
\{a\}
{a} 序列位置
p
o
s
i
,
p
o
s
j
pos_i,pos_j
posi,posj 那么如果
b
i
>
b
j
b_i>b_j
bi>bj,那么一定满足
p
o
s
i
<
p
o
s
j
pos_i<pos_j
posi<posj,否则就不成立。
这个树状数组维护一下即可。
ABC158F Removing Robots
说是个线段树题…结果想了半天发现直接单调栈就完事了…
考虑预处理每个机器人触发后会连续出发到第几个机器人,这个可以简单的用单调栈解决。
然后就是一个线性递推就没了。
ARC099B Snuke Numbers
打表题…
之前只打了
n
≤
1000
n\leq 1000
n≤1000 的表,以为规律就是
x
99
…
999
x99\dots 999
x99…999,然后兴高采烈的 WA 掉了…
实际上
1099
,
1199
,
…
1099,1199,\dots
1099,1199,…这样的数都是Snuke Numbers
。但是能够发现的是只有前两位数在改变,这意味这我们可以直接暴力数数找到这些数。至于合法性,我们通过观察普遍的单调性,与最小的那个数比较即可。
ExaWizards 2019 Snuke the Wizard
这种题老是要绕半天才绕到正路上来…
直接考虑两边向中间倒着走,发现离开棋盘的一定是一个前缀+后缀,这个二分解决即可。
*Tenka1 Programmer Contest 2019 D.Three Colors
真的被自己蠢到了…
假设
∑
a
i
=
s
u
m
\sum a_i=sum
∑ai=sum,设
R
+
B
+
G
=
s
u
m
R+B+G=sum
R+B+G=sum。
三角形成立的条件为:
{
R
+
G
<
B
R
+
B
<
G
B
+
G
<
R
\left\{ \begin{aligned} R+G<B \\ R+B<G \\ B+G<R\\ \end{aligned} \right.
⎩⎪⎨⎪⎧R+G<BR+B<GB+G<R
然后我们就可以得到:
{
R
<
s
u
m
2
B
<
s
u
m
2
G
<
s
u
m
2
\left\{ \begin{aligned} R<\frac{sum}{2} \\ B<\frac{sum}{2} \\ G<\frac{sum}{2}\\ \end{aligned} \right.
⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧R<2sumB<2sumG<2sum
而如果不成立,就会有且存在一个边使得其大于等于
s
u
m
2
\frac{sum}{2}
2sum。这个我们可以考虑用简单的dp来计算。
注意还要处理
s
u
m
2
,
s
u
m
2
,
0
\frac{sum}{2},\frac{sum}{2},0
2sum,2sum,0 这样的三边的情况,因此我们还需要一个 dp 来计算这个答案。
复杂度:
O
(
n
2
max
a
i
)
O(n^2\max a_i)
O(n2maxai)。
2020.11.16
不知道为什么写题解写了这么久…
2020.11.16 比赛总结&题解合集
2020.11.17
作业做的太慢了,为什么别人都是随手就写完一题啊…
赶作业赶得都要吐了…
ARC069D Flags
Atcoder 真的很少能见到这么套路的题目…
显然题目有二分性,我们二分答案
d
d
d ,然后我们会得到一些关于选了某个位置就不能与另一种选择相矛盾的关系,而这显然就是一个 2-SAT 问题。
不过暴力连边过了
n
≤
1
0
4
n\leq 10^4
n≤104 的数据。注意到连边是一个连续的区间,相信大家已经知道这道题就是一个码农题了…
不过2-SAT+线段树优化建图有个常见的 bug 叫做自己连自己。为了避免这种情况,我们需要单独处理坐标相同的点,当然这样做其实麻烦了,建图的时候稍微特判一下就好了…
知道了这些,你就可以开始码码码码码码了…
*KEYENCE Programming Contest 2019 E.Connecting Cities
[USACO20FEB]Timeline G
直接拓扑排序最长路即可。
[USACO20JAN]Farmer John Solves 3SUM G
O
(
n
2
)
O(n^2)
O(n2) 求出所有
(
i
,
k
)
(i,k)
(i,k) 对应的合法
j
j
j 的个数
(
i
<
j
<
k
)
(i<j<k)
(i<j<k)。然后一个区间
[
L
,
R
]
[L,R]
[L,R] 只要完全包含
(
i
,
k
)
(i,k)
(i,k) 两点就要计入答案。这就是一个经典的二维前缀和问题。
复杂度:
O
(
n
2
)
O(n^2)
O(n2)
[USACO20OPEN]Exercise G
首先转化
n
n
n 的整数拆分能产生多少不同的
l
c
m
lcm
lcm。
考虑对于每种不同的
l
c
m
lcm
lcm 我们只用拆分出的数的和最小的情况来表达。和没有达到
n
n
n 我们用
1
1
1 来凑,显然
l
c
m
lcm
lcm 不变。而和最小的情况显然就是
p
1
k
1
,
p
2
k
2
,
p
3
k
3
,
…
,
p
t
k
t
p_1^{k_1},p_2^{k_2},p_3^{k_3},\dots,p_t^{k_t}
p1k1,p2k2,p3k3,…,ptkt。因此直接做背包就可以了。
复杂度:
O
(
p
n
log
2
n
)
O(pn\log_2n)
O(pnlog2n)(
p
p
p 表示
n
n
n 以内质数个数)。
*[USACO20FEB]Equilateral Triangles P
结论题。
将曼哈顿距离转为切比雪夫距离,发现转化后这个三角形在一个与坐标轴水平的正方形中,且一边与正方形重合。
这个东西可以枚举一个正方形端点和边长,然后简单用前缀和计数。
注意上下左右四个方向的三角形都需要计数,边界需要减去一次计数。
复杂度:
O
(
n
3
)
O(n^3)
O(n3)
[ARC080D] Prime Flip
感觉这道题目全是巧合…
首先显然可以用差分转换题目,那么现在我们在数轴上有若干个
1
1
1,每次同时翻转
x
x
x 和
x
+
p
r
i
m
e
x+prime
x+prime,问最小翻转次数。
考虑距离为
d
d
d 的两点最小需要翻转几次。自己找显然很不直观,我们可以尝试打表找最短路径来解决这个问题。
打表之后会发现:
d d d 为奇质数:均为 1 1 1 次。
d d d 为偶数:均为 2 2 2 次。(其实就是哥德巴赫猜想)
d d d 为奇合数:均为 3 3 3 次。
然后这题就可做了。
容易发现我们其实只需要最大化第一种情况,后两种情况在解决完第一种情况之后就可以根据奇偶性贪心匹配。
而对于第一种情况,距离为奇数,这意味着我们也可以分出奇偶性,因此我们跑一个二分图就可以解决了。
复杂度:
O
(
网
络
流
)
O(网络流)
O(网络流)😃
*[ARC063D] Snuke’s Coloring 2
神仙题,想了半天想到了个寂寞。
突然才想起来 [Code+#3]寻找车位 就是这题的加强版。
原题就等价于求最大的不包含点的长方形的周长。
本题有个非常巧妙的部分,就是最终的答案的下界一定是
2
max
{
W
,
H
}
+
2
2\max\{W,H\}+2
2max{W,H}+2 (其实很容易看出)。这意味着我们最终答案的正方形一定是过
x
=
W
2
x=\frac{W}{2}
x=2W 或者
y
=
H
2
y=\frac{H}{2}
y=2H 的。
那么我们就可以分别讨论,以
y
=
H
2
y=\frac{H}{2}
y=2H 为例,考虑我们现在要求以
x
1
x_1
x1 为
x
x
x 轴右端点,过
y
=
H
2
y=\frac{H}{2}
y=2H 的正方形的最大周长。那么,随着
x
x
x 轴左端点
x
0
x_0
x0 的减小,我们的对
y
y
y 轴的限制也会变强。对于
y
y
y 轴的限制显然可以使用两个单调栈来维护。但是在计算时我们还需要计入
x
x
x 轴的贡献。其实这个也简单,来一个线段树配合单调栈区间修改就能快速维护最值。
复杂度:
O
(
n
log
n
)
O(n\log n)
O(nlogn)。
CF712E Memory and Casinos
之前做过两遍的题目。
主要思想就是找到合并区间概率的一种方法。
定义
f
(
l
,
r
)
f(l,r)
f(l,r) 表示从
l
l
l 开始不走出区间
[
l
,
r
]
[l,r]
[l,r],最终到达
r
r
r 点的概率,
g
(
l
,
r
)
g(l,r)
g(l,r) 表示从
r
r
r 开始不走出区间
[
l
,
r
]
[l,r]
[l,r],最终到达
l
l
l 点的概率。
考虑用
[
l
,
p
]
[l,p]
[l,p] 与
[
p
+
1
,
r
]
[p+1,r]
[p+1,r] 的值求得
[
l
,
r
]
[l,r]
[l,r] 的值,显然有:
f
(
l
,
r
)
=
f
(
l
,
p
)
f
(
p
+
1
,
r
)
+
f
(
l
,
p
)
(
1
−
f
(
p
+
1
,
r
)
)
(
1
−
g
(
p
,
r
)
)
f
(
p
+
1
,
r
)
+
…
f(l,r)=f(l,p)f(p+1,r)+f(l,p)(1-f(p+1,r))(1-g(p,r))f(p+1,r)+\dots
f(l,r)=f(l,p)f(p+1,r)+f(l,p)(1−f(p+1,r))(1−g(p,r))f(p+1,r)+…
使用等比数列求和得到:
f
(
l
,
r
)
=
f
(
l
,
p
)
f
(
p
+
1
,
r
)
1
−
(
1
−
f
(
p
+
1
,
r
)
)
(
1
−
g
(
p
,
r
)
)
f(l,r)=\frac{f(l,p)f(p+1,r)}{1-(1-f(p+1,r))(1-g(p,r))}
f(l,r)=1−(1−f(p+1,r))(1−g(p,r))f(l,p)f(p+1,r)
同理可得:
g
(
l
,
r
)
=
g
(
l
,
p
)
g
(
p
+
1
,
r
)
1
−
(
1
−
f
(
p
+
1
,
r
)
)
(
1
−
g
(
p
,
r
)
)
g(l,r)=\frac{g(l,p)g(p+1,r)}{1-(1-f(p+1,r))(1-g(p,r))}
g(l,r)=1−(1−f(p+1,r))(1−g(p,r))g(l,p)g(p+1,r)
这样我们只需要在线段树上维护
f
f
f 和
g
g
g 函数就能够快速回答区间的概率并支持单点修改了。
复杂度:
O
(
n
log
n
)
O(n\log n)
O(nlogn)。
tip:CF 上 C++ 编译器上有一个奇怪的 bug,就是在 struct/class 函数里面的 pair 数组过大会编译超时…可以选择换成结构体或者去掉 struct。
LOJ2733「JOISC 2016 Day 2」三明治
感觉怪怪的…看起来像一个拓扑排序之类的,尝试了一下却发现不是很行。那就搜索吧 😃
很容易想到一个
O
(
n
4
)
O(n^4)
O(n4) dfs,即我们枚举每个终点,倒推回起点算最短路径。
注意到我们如果确定了向前吃,那么前面一整行的蛋糕必然都需要被吃,那么对于一整行我们可以每次继承前面一个位置的答案,这样复杂度就相当于一次 dfs。
复杂度:
O
(
n
3
)
O(n^3)
O(n3)。
说的这么简单,结果我差点被 dfs 里面各种各样的细节调疯了…
[JLOI2014]聪明的燕姿
还是一道搜索题目。
注意到大于
S
\sqrt{S}
S 的质数显然只会有一个且一定贡献
S
+
1
S+1
S+1,我们可以预处理一定范围内的质数,暴力枚举它的出现次数,最后剩下的数检验它是不是质数加1即可。
由于枚举时我们需要检验它是否整除,实际效率极快。
2020.11.18
2020.11.19
差距又拉大了…开启赶作业模式…
因此下面这些相对简单的题目就不分析了:
LOJ2733「JOISC 2016 Day 2」三明治
LOJ2872 「JOISC 2014 Day1」巴士走读
[JLOI2015]战争调度
[HEOI2015]兔子与樱花
[HNOI2015]菜肴制作
[HEOI2015]定价
[六省联考2017]期末考试
[JXOI2017]加法
*[SDOI2015]排序
实际上是一个语文题…题面中的 “操作位置不同” 的真实含义是操作种类在操作序列中的位置而不是该种操作具体交换了哪两个位置。
这样来说我们可以直接
2
n
2^n
2n 枚举操作总类的构成,贡献就是它的 1
的个数的阶乘。
现在我们还需要判断这种方案是否合法。
我们按种类从小到大进行判定。首先我们对该种交换
*[SHOI2015]聚变反应炉
*[POI2011]DYN-Dynamite
感觉这种方法很难想到。
*[AHOI2017/HNOI2017]大佬
2020.11.20
[USACO20OPEN]Favorite Colors G
花个20多分钟读懂这道题目翻译在表达什么意思…然后你就会发现这题就是个模拟题。
考虑用链表模拟合并两个点的操作,将入度大于
2
2
2 的点存入队列,直接模拟一边就可以了。
不知道 vector + 启发式合并 有没有问题,听说数据有亿点水:)。
复杂度:
O
(
n
+
m
)
O(n+m)
O(n+m)。
*[USACO20JAN]Non-Decreasing Subsequences P
怎么 Platinum 和 Glod 难度差距这么大…
2020.11.21
2020.11.22
论文题看半天都看不明白,自闭了…
确实在阅读论文方面很不足…
*[USACO20OPEN]Exercise P
毒瘤题。
[SDOI2008]Sue的小球
如过做过这道题,我肯定会做昨天的 T3;如果单做这道题,我也能做出来,但是单做昨天 T3 就不一定了…
和昨天 T3 的思路完全一样,我们定义
f
l
,
r
,
0
/
1
f_{l,r,0/1}
fl,r,0/1 表示当前走过了
x
l
x
r
x_l~x_r
xl xr 号点且最终停留在
x
l
/
x
r
x_l/x_r
xl/xr 点,在走的时候我们提前计算区间外的亏损。只不过本题要求我们全部接完,因此我们就不用枚举最终接了多少个小球了。
复杂度:
O
(
n
2
)
O(n^2)
O(n2)。
SP1526 Ranklist Sorting
UVA10559 方块消除 Blocks
NOI2008 奥运物流
2020.11.23
[PA2014]Fiolki
这绿题…比我想象中的要难啊…
考虑将药水合并的过程抽象成一个二叉树的结构,那么对于任意一个可发生反应
c
i
,
d
i
c_i,d_i
ci,di ,它会在这颗树的
L
C
A
(
c
i
,
d
i
)
LCA(c_i,d_i)
LCA(ci,di) 位置上发生,由于树形结构的包含关系,我们只需要从叶子向上依次将整个反应过程模拟一遍就可以计算代价了。
复杂度:
O
(
n
log
n
)
O(n\log n)
O(nlogn)。
P5807 Which Dreamed It
Best Theorem板子题。
这个定理就是用来解决有向图中欧拉回路数:
e
c
s
(
G
)
=
t
s
∏
i
∈
V
(
d
e
g
i
−
1
)
!
ec_s(G)=t_s\prod_{i\in V}(deg_i-1)!
ecs(G)=tsi∈V∏(degi−1)!
其中
t
s
t_s
ts 就是有向图以
s
s
s 为根的生成树数目。
不过本题中我们要计算以
1
1
1为起点的路径数,这意味这我们在
1
1
1 点选择一条出边为起点(终点的边显然会固定),这样会有
d
e
g
1
deg_1
deg1 种选择,因此我们还需要乘上
d
e
g
1
deg_1
deg1。
注意特判
n
=
1
n=1
n=1。
2020.11.24
[JSOI2013]吃货 JYY
感觉很是一个转移比较奇怪的状压 dp…
显然我们可以利用欧拉回路的结论来进行 dp。注意本题不要求每条边只能够走依次,因此我们应该先做一次 Floyd 再dp。
考虑定义状态
s
t
a
sta
sta 为一个三进制数,其中 0
代表该点不与起点联通,1/2
表示该点与起点联通且其连边度数为偶数。
由于一些边必须被选中,因此考虑我们定义
f
s
t
a
f_{sta}
fsta 表示确定了每个点与起点的联通状态下,仅非必选边影响度数奇偶性,在这个情况下我们需要的最小代价。
我们可以采用 BFS 辅助转移,具体转移时,我们选择一个联通的点和一个不联通的点,如果我们选择连必选边,我们先不急着计算影响的度数的奇偶性和它带来的代价,反之我们就应该计算。
最后我们再将必选边影响的度数的奇偶性和代价全部计入(这样才能让它们必选),注意到这样不一定能够保证整个连通块是一个欧拉回路,我们可以提前预处理
g
[
S
]
g[S]
g[S] 表示连通块奇偶性分布为
S
S
S 时变为度数全偶的代价。这样欧拉回路的问题也解决了。
复杂度:
O
(
n
3
n
)
O(n3^n)
O(n3n) (注意写法上的细节可能会使复杂度退化)
[AGC032C]Three Circuits
比较简单的一道题。
首先我们这张图显然必须是一个欧拉回路。
通过观察样例我们很容易发现,只要存在一个度数
≥
6
≥6
≥6 的点,我们显然可以将其拆分为三个欧拉回路。
接着我们考虑点的度数全都等于
2
2
2 的情况——这就是一个环,显然这也不成立。
那么我们就只剩下了存在若干个度数等于
4
4
4 的点的情况,我们设其为
x
x
x。
如果
x
=
1
x=1
x=1,显然不成立。
如果
x
=
2
x=2
x=2,有两种情况:
显然只有第一类结构合法,这个我们可以直接判断去掉度数为
4
4
4 的点之后是否存在一条链使得其左右相连的点相同。
如果
x
≥
3
x≥3
x≥3,手玩一下会发现也都合法。
[APIO2013]机器人
与斯坦纳树 dp 非常类似,只是因为本题的特殊性质,我们可以考虑将其表示为一段连续的区间。
定义
f
l
,
r
,
x
,
y
f_{l,r,x,y}
fl,r,x,y 表示当前有一个
l
−
r
l-r
l−r 型机器人停留再
(
x
,
y
)
(x,y)
(x,y) 点所需移动次数。
和斯坦纳树一样,对于每个
(
l
,
r
)
(l,r)
(l,r),我们利用 SPFA 来进行 dp 转移。
区间和区间之间显然有:
f
l
,
r
,
x
,
y
=
min
l
≤
k
<
r
{
f
l
,
k
,
x
,
y
+
f
k
+
1
,
r
,
x
,
y
}
f_{l,r,x,y}=\min_{l\leq k<r}\{f_{l,k,x,y}+f_{k+1,r,x,y}\}
fl,r,x,y=l≤k<rmin{fl,k,x,y+fk+1,r,x,y}
但是…SPFA本来就跑得慢…再加上本题巨卡,由于这个图的每条边权均为 1
,它在用 dij 跑时存在单调性,即我们每次松弛完的状态一定会大于等于之前松弛的状态的权值。这意味这我我们可以采用两个权值单调的队列,一个存从未松弛过的点,一个存松弛过若干次的点,那么我们只需要对一开始的队列做基数排序即可 (普通排序卡不过…)。
一开始 dfs 的时候记住要记忆化…
复杂度:
O
(
w
h
n
3
+
n
2
(
max
v
+
w
h
)
)
O(whn^3+n^2(\max v+wh))
O(whn3+n2(maxv+wh))
在洛谷上非常卡,如果过不去建议手写队列。
[AGC018F] Two Trees
人类智慧题。
有印象之前听谁口胡过…但我怎么会就因此会做 AGC 的 F 呢对吧…
首先容易发现
x
i
=
{
−
1
,
0
,
1
}
x_i=\{-1,0,1\}
xi={−1,0,1}。
在
m
o
d
2
\mod 2
mod2 意义下考虑,对于一个点而言我们每个儿子都会有
1
1
1 的贡献,那么如果我们的儿子数为奇数,我们这个点填上的点一定为偶数,反之也成立。
那么两棵树对应点奇偶性不同就一定 IMPOSSIBLE
,接下来我们会发现其它情况都是 POSSIBLE
的。
我们只需要确定填的数为奇数的点为
1
1
1 还是
−
1
-1
−1 即可。
考虑建出这两棵树,对于我们对应标号填奇数的点我们在这两点间连边。
发现这个图的所有点都变为偶数,我们跑一遍欧拉回路给我们新增的边定向。
我们将两种不同方向的边分别给对应点赋上
1
/
−
1
1/-1
1/−1 即可。
证明的话我们可以将一颗子树看为一个整体,由于欧拉回路的性质,进入该子树的边和出该子树的边数相等,而只有我们的父亲-儿子这条边没有被赋值,因此它的子树和一定为
1
/
−
1
1/-1
1/−1。
对于根的证明可能要特殊讨论一下。
复杂度:
O
(
n
)
O(n)
O(n)。
[APIO2013]道路费用
考虑一个暴力做法:我们枚举子集确定每条边是否加入最小生成树,然后再加入可能可以参与的
n
n
n 条先前在最小生成树上的边,我们通过这些边确定每条边的最大边权即可。
但是我们会发现,由于我们来代替的边很少,那么这意味着我们能被替代的原最小生成树上的边也很少。
加入我们将全部
k
k
k 条边都先加入最小生成树,那么那些之后被加入的边就是我们无论如何都不会替代的边。而它们会形成
k
+
1
k+1
k+1 个连通块,会被替代的边也是
k
k
k 条。
因此我们考虑将将这些连通块缩成一个点,然后我们在这个树上计算替代这些边的代价。
说的这么简单但是写起来…
复杂度:
O
(
2
k
k
2
)
O(2^kk^2)
O(2kk2)。
[NOI2013]树的计数
神奇的结论题。
2020.11.25
2020.11.26
被打击到了,发现别人作业题题都会,我连题解都看不懂。
等着退役呗。
[POI2010]Bridges
P5633 最小度限制生成树
解法1
解法2
P5540 [BalkanOI2011] timeismoney
最小乘积生成树 模板题。
CF161C Abracadabra
很妙的一道题目。
2020.11.27
2020.11.28
2020.11.29
终于有一天的时间能好好颓废辣!
week 2
和 OI 相伴的最后一周,好好珍惜吧。
NOIP 也就只算是最后的结业考试了。
2020.11.30
2020.12.01
CF375D Tree and Queries
算是 dsu on tree 模板复习题吧?
「JOISC 2014 Day3」电压
第三次做这道题,首尾呼应。
发现自己又忘了无向图 dfs 树上只存在返祖边和树边了(同理,无向图的 BFS 树上只存在横叉边和树边)。
然后我们再来考虑这道题,结论显然是找一条所有奇环都覆盖且没有被任何偶环覆盖的边。
我们根据上面的结论,直接树上差分计算即可。
奇数环个数为
1
1
1 时要计入这条环上的返祖边(这条边显然只会在奇环上)。
复杂度:
O
(
n
+
m
)
O(n+m)
O(n+m)。
CF1132G Greedy Subsequences
考虑每个点与它右边最近的大于它的点连边,这样我们形成了一颗森林。
那么每次我们将会从中增加一个点,删去一个点,对答案的影响就是它这一整颗子树。
这个用线段树区间修改同时维护全局最大值即可。
复杂度:
O
(
n
log
n
)
O(n\log n)
O(nlogn)
CF639F Bear and Chemistry
一道纯粹的码农题。
考虑先对原图缩点,然后求出给定点集的虚树,然后再加上新增的边,一起跑一边 tarjan 即可。
结果我把怎么建虚树忘干净了。
复杂度:
O
(
(
n
+
m
)
log
n
)
O((n+m)\log n)
O((n+m)logn)。