文章目录
摘要
发现前面学的东西都忘得差不多了,想复习也找不到原来写的题了,所以从今天开始记录一下学习算法的足迹。
基础算法
二分
Codeforces Round #686 (Div. 3) F. Array Partition
求满足
m
a
x
(
1
,
x
)
=
m
i
n
(
x
+
1
,
y
)
=
m
a
x
(
y
+
1
,
n
)
max(1,x)=min(x+1,y)=max(y+1,n)
max(1,x)=min(x+1,y)=max(y+1,n)的
l
e
n
1
=
x
,
l
e
n
2
=
y
−
x
,
l
e
n
3
=
n
−
y
len1=x,len2=y-x,len3=n-y
len1=x,len2=y−x,len3=n−y 。根据
m
i
n
min
min和
m
a
x
max
max具有二分的性质,直接在二分的时候判断两个条件来调整
l
,
r
l,r
l,r即可。
倍增
Codeforces Round #717 (Div. 2) D. Cut 倍增
一个比较巧妙的在序列上的倍增,启发了能跳一步,就可以用二进制倍增一下子跳很多步。
前缀和
Codeforces Round #619 (Div. 2) E. Nanosoft 思维 + 二维前缀和
构造
Codeforces Round #606 (Div. 2, based on Technocup 2020 Elimination Round 4)
根据
x
=
(
x
+
1
)
m
o
d
a
,
y
=
(
y
+
1
)
m
o
d
b
x=(x+1)\bmod a,y=(y+1)\bmod b
x=(x+1)moda,y=(y+1)modb的方式来构造每个点所在的每行每列都不相等的矩阵。
Codeforces Round #712 (Div. 2) D. 3-Coloring 交互 构造
奇偶构造,让后第三种颜色放非空的位置。
Codeforces Round #609 (Div. 2) D. Domino for Young 黑白染色
进行黑白染色,可以将
1
×
2
1×2
1×2的多米诺骨牌进行匹配,答案为小的那个颜色。
Codeforces Round #619 (Div. 2) D. Time to Run 矩阵回路构造
图论
bfs
Codeforces Round #619 (Div. 2) F. Super Jaber 多源bfs + 思维转换
dfs\dfs序
P3605 [USACO17JAN]Promotion Counting P
配合树状数组解决一类子树统计问题,比如这个题就是统计
p
j
>
p
i
p_j>p_i
pj>pi的个数。
Codeforces Round #606 (Div. 2, based on Technocup 2020 Elimination Round 4)
模型抽象 + 问题转化。
同余最短路
通常伪装成一类数论题。
跳楼机
板子题,用
x
,
y
,
z
x,y,z
x,y,z组成
h
h
h。
墨墨的等式
板子题,看到这一类的式子应该很快想到同余最短路,让后将
[
l
,
r
]
[l,r]
[l,r]的区间转化为前缀区间即可。
GYM Sums
上一题的简化版,这个题只问了能否组成
x
x
x,那么只需要
x
>
=
d
i
s
[
x
m
o
d
b
a
s
e
]
x>=dis[x\bmod base]
x>=dis[xmodbase]即可。
Lazy Running HDU - 6071 好题
分层 + 同余最短路
差分约束
E. Capitalism
根据
a
j
=
a
i
+
1
a_j=a_i+1
aj=ai+1构造不等式,让后判断是否有负环,且由于这个题的特殊性,还要判断是否为二分图。
LCA
Codeforces Round #620 (Div. 2) E. 1-Trees and Queries 思维 + LCA
比较巧妙的一个题,多加一条边可能改变路径的奇偶性。
基环树
Codeforces Round #686 (Div. 3) E. Number of Simple Paths
基环树,求路径长度
>
=
1
>=1
>=1的路径个数。用总情况
n
∗
(
n
−
1
)
n*(n-1)
n∗(n−1)减去在一棵树的情况
s
e
[
i
]
∗
(
s
e
[
i
]
−
1
)
/
2
se[i]*(se[i]-1)/2
se[i]∗(se[i]−1)/2即为答案。
dp
线性dp
E2. Square-free division (hard version) 题解
预处理出来
l
e
f
t
left
left数组方便找能转移的位置,让后直接dp转移就行啦。
概率期望
P5104 红包发红包
w
w
w的红包,第
k
k
k个人抢到的钱的期望为
w
2
k
\frac{w}{2^k}
2kw。
游走
在DAG上路径长度的期望,
f
[
i
]
f[i]
f[i]表示到
i
i
i这个点的总长度,
g
[
i
]
g[i]
g[i]表示到
i
i
i这个点路径的总个数。
Codeforces Round #604 (Div. 2) E. Beautiful Mirrors 题解
从
1
1
1走到
n
n
n,失败了就回
1
1
1号点,求到
n
n
n期望步数。主要理解一下回到起点的一部分。
f
[
i
]
=
(
f
[
i
−
1
]
+
1
)
∗
p
i
100
+
(
f
[
i
−
1
]
+
f
[
i
]
+
1
)
∗
100
−
p
i
100
f[i]=(f[i-1]+1)*\frac{p_i}{100}+(f[i-1]+f[i]+1)*\frac{100-p_i}{100}
f[i]=(f[i−1]+1)∗100pi+(f[i−1]+f[i]+1)∗100100−pi
SP1026 FAVDICE - Favorite Dice
一个n面的骰子,求期望掷几次能使得每一面都被掷到。求出概率,让后期望=1/概率得出答案即可。
绿豆蛙的归宿
基础期望dp,建反图逆推就好啦。
CF1042E Vasya and Magic Matrix
列出普通式子,让后把平方拆开,维护一下变量
O
(
1
)
O(1)
O(1)转移即可。
背包dp
AT F - Potion
f
[
i
]
[
j
]
[
k
]
f[i][j][k]
f[i][j][k]表示前
i
i
i个数选了
j
j
j个且
m
o
d
l
e
n
\bmod \ \ len
mod len为
k
k
k
树形dp
Codeforces Round #701 (Div. 2) E. Move and Swap 思维 + dp
去绝对值优化转移。
数位dp
AtCoder Beginner Contest 194 F - Digits Paradise in Hexadecimal
比较裸的数位
d
p
dp
dp了,说一下状态吧:设
d
p
[
p
o
s
]
[
s
t
a
t
e
]
[
f
l
a
g
]
[
l
e
a
d
]
dp[pos][state][flag][lead]
dp[pos][state][flag][lead]为到了
p
o
s
pos
pos位置,状态为
s
t
a
t
e
state
state,是否能枚举到上界
f
l
a
g
flag
flag,以及是否存在前导零
l
e
a
d
lead
lead
Palindromic Numbers LightOJ - 1205
用数位
d
p
dp
dp求
[
l
,
r
]
[l,r]
[l,r]有多少个回文数。我们只需要记一下每次选的数,让后
d
p
dp
dp状态设计加上回文开始的位置
p
r
e
pre
pre以及当前是否为回文就可以表征出这个数字的状态了。
状压dp
Educational Codeforces Round 80 (Rated for Div. 2) 二分 + 状压
O
(
n
∗
2
n
)
O(n*2^n)
O(n∗2n)递推子集。
Codeforces Round #622 (Div. 2) D. Happy New Year 状压dp
根据区间涉及状态,将区间离散化,成为左闭右开的区间,信息都存在左端点,先删后加。
区间dp
Codeforces Round #715 (Div. 2) C. The Sports Festival 区间dp
将
a
a
a数组排序之后就是个裸的区间
d
p
dp
dp了,可以只从两头转移,复杂度优化成
O
(
N
2
)
O(N^2)
O(N2)。
计数dp
Educational Codeforces Round 81 (Rated for Div. 2) F.Good Contest \ 洛谷 划艇 组合 计数dp
数据结构优化dp
Educational Codeforces Round 81 (Rated for Div. 2) E. Permutation Separation 线段树 + dp
通过线段树区间加法,以及维护全局最小值,可以优化
d
p
dp
dp过程。
Codeforces Round #620 (Div. 2) F2. Animal Observation (hard version) dp + 线段树
优化区间转移。
数据结构
树上启发式合并
CodeForces - 208E Blood Cousins
树启板子,将原本询问与
x
x
x的
p
p
p级祖先相同的个数转化成祖先的
p
p
p级儿子有几个,减一即为答案。把询问存到每个点上,维护一下子树的
d
e
p
t
h
depth
depth,更新即可。
CodeForces - 570D Tree Requests
每次询问
v
v
v对应的子树中,深度为
h
h
h的这层节点的字母,能否打乱重排组成回文串。定义一个
c
[
i
]
[
j
]
c[i][j]
c[i][j]表示深度为
i
i
i,字母
j
+
′
a
′
j+'a'
j+′a′有几个,让后在定义一个
f
l
a
g
[
i
]
flag[i]
flag[i]表示深度为
i
i
i有几个字母出现了奇数次,让后当
f
l
a
g
[
i
]
<
=
1
flag[i]<=1
flag[i]<=1的时候可以,否则不可以。
CodeForces - 600E Lomsat gelral
问子树中出现次数最多的节点编号之和。经典入门题了,不多说。
CodeForces - 1009F Dominant Indices
d
(
u
,
i
)
d(u,i)
d(u,i)表示
u
u
u子树到
u
u
u距离为
i
i
i的个数,对每个
u
u
u求最小
k
k
k使得
d
(
u
,
k
)
d(u,k)
d(u,k)最大。定义一个
c
n
t
[
i
]
cnt[i]
cnt[i],让后更新
i
d
id
id即可。最后删除子树的时候不要忘记更新
m
a
x
max
max和
i
d
id
id为
0
0
0。
CodeForces - 375D Tree and Queries 题解 好题
c
n
t
cnt
cnt维护
>
=
k
j
>=k_j
>=kj的颜色个数,可以省掉一层
l
o
g
n
logn
logn。
2019 ICPC Asia Nanchang Regional K.Tree
树启 + 动态开点。
CF741D Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths
树启 + 状压 好题。需要用到
d
s
u
dsu
dsu遍历的顺序,先遍历轻儿子,清空轻儿子,才遍历重儿子,所以修改全局的值不会影响到后来遍历的重儿子的值。
主席树
主席树求mex
维护每个数最后出现的位置,在第
r
r
r棵树上找出现位置
<
l
<l
<l的最小值即可。
2016中国大学生程序设计竞赛(长春)Sequence II HDU - 5919
主席树维护第一次出现的位置,维护区间和,倒着插入即可。
Prefix HDU - 5790 字典树 + 主席树
维护每个前缀最后出现的位置,查询区间和即可。
P2839 [国家集训队]middle 二分 + 主席树 在值域上建区间
中位数建主席树,优化递推求每次的区间。
P3899 [湖南集训]谈笑风生 主席树解决二维数点
在
d
f
s
dfs
dfs序上建树,让后转换成一个深度区间和一个
d
f
s
dfs
dfs序区间,以深度为下标建立主席树即可。
P3293 [SCOI2016]美味 主席树 + 伪01trie
利用01trie的思想,将树上贪心转换成区间贪心,每次都可以转换成区间询问,让后根据询问结果更新答案即可。
Codeforces Round #716 (Div. 2) D. Cut and Stick 主席树 + 思维
主席树查询区间是否存在出现次数大于
n
/
2
n/2
n/2的数。
Splay
线段树分治
二分图\模板
将每个边出现的时间在线段树上划分成
l
o
g
n
logn
logn段,让后用可撤销并查集维护就好啦。
CF981E Addition on Segments 线段树分治 + bitset优化 题解
将询问区间分成
l
o
g
n
logn
logn段,让后从根遍历到最后只有一个点的时候保证了这个点可以成为最大值,因为所有区间都包含这个点,让后每次用
b
i
t
s
e
t
bitset
bitset的左移操作将其加
x
x
x即可。
Kruskal重构树
目前做的题都比较套路,维护边权
≤
w
\le w
≤w能到的连通块。
Network 黑暗爆炸 - 3732 倍增lca || Kruskal重构树
两点的
l
c
a
lca
lca即为最大边。
Peaks加强版 黑暗爆炸 - 3551 Kruskal重构树 + 主席树
找到连通块,dfs序处理一下,即为查询块第
k
k
k大。
P4768 [NOI2018] 归程 Kruskal重构树 + 倍增 + 最短路
最短路预处理。
数论
基础数论
HDU - 4497 GCD and LCM
给三个数的
l
c
m
lcm
lcm和
g
c
d
gcd
gcd,求满足条件的
(
x
,
y
,
z
)
(x,y,z)
(x,y,z)个数。经典套路把
(
x
,
y
,
z
)
(x,y,z)
(x,y,z)都除个
g
c
d
(
x
,
y
,
z
)
gcd(x,y,z)
gcd(x,y,z),让后对
l
c
m
(
x
,
y
,
z
)
g
c
d
(
x
,
y
,
z
)
\frac{lcm(x,y,z)}{gcd(x,y,z)}
gcd(x,y,z)lcm(x,y,z)分解质因子统计数量即可。
Educational Codeforces Round 106 (Rated for Div. 2) D. The Number of Pairs
方法同上,只不过给了个式子没有那么明显。只需要让
l
c
m
(
x
,
y
)
=
k
∗
g
c
d
(
x
,
y
)
lcm(x,y)=k*gcd(x,y)
lcm(x,y)=k∗gcd(x,y),再进行化简式子就好啦。
Educational Codeforces Round 81 (Rated for Div. 2) D. Same GCDs 欧拉函数
将
a
,
m
a,m
a,m都除
g
c
d
(
a
,
m
)
gcd(a,m)
gcd(a,m)之后,答案即为
m
g
c
d
(
a
,
m
)
\frac{m}{gcd(a,m)}
gcd(a,m)m的欧拉函数。