誓要暑假刷穿 edu 2200 - 2800
图论
E. Square Root of Permutation
题意:
思路: i 向
p
i
p_i
pi 连边建图,分类讨论环的数量
有向图强连通 / 无向图双连通
E. Pursuit For Artifacts
题意:
思路: 无向图双连通,tarjan缩点之后是一颗树,从根节点dfs就可以
二分图
F. Edge coloring of bipartite graph
题意: 给你一个二分图,边染色让相邻边颜色不同
结论: 颜色数量最多
max
d
u
\max d_u
maxdu(度的大小)
思路: 枚举度数然后确定
a
n
s
ans
ans ,枚举每一个点对之间边的颜色是否染色,枚举颜色编号确定边的染色编号
网络流
F. Bear and Fair Set
题意:
结论:
l
−
r
l-r
l−r 中
m
o
d
5
=
j
\mod 5=j
mod5=j 的个数有
⌊
r
−
j
5
⌋
−
⌊
l
−
j
5
⌋
\lfloor\frac{r - j}{5}\rfloor-\lfloor\frac{l - j}{5}\rfloor
⌊5r−j⌋−⌊5l−j⌋ 个,
c
a
l
c
(
l
,
r
,
j
)
calc(l, r, j)
calc(l,r,j)表示
l
−
r
l-r
l−r中
m
o
d
5
=
j
\mod 5=j
mod5=j的个数
思路: 定义
i
d
i
id_i
idi 图中表示
m
o
d
5
=
i
\mod5 = i
mod5=i 的点的 id
对于
q
i
=
{
u
i
,
t
i
}
,
q
0
=
{
0
,
0
}
,
q
m
+
1
=
{
b
,
n
}
q_i = \{u_i, t_i\},q_0 = \{0, 0\},q_{m + 1} = \{b, n\}
qi={ui,ti},q0={0,0},qm+1={b,n},按
u
i
u_i
ui排序
从 S 向 i 建边,流量为
t
i
−
t
i
−
1
t_i-t_{i-1}
ti−ti−1
从 i 向
i
d
j
,
{
j
=
0
,
1
,
2
,
3
,
4
}
id_j,\{j = 0,1,2,3,4\}
idj,{j=0,1,2,3,4}建边,流量为
c
a
l
c
(
u
i
−
1
,
u
i
,
j
)
calc(u_{i-1},u_i,j)
calc(ui−1,ui,j)
所以,如果
t
i
−
t
i
−
1
<
0
t_i-t_{i-1} <0
ti−ti−1<0 或者
u
i
−
u
i
−
1
<
t
i
−
t
i
−
1
u_i-u_{i-1}<t_i-t_{i-1}
ui−ui−1<ti−ti−1,就肯定unfair
从
i
d
j
id_j
idj向 E 建边,流量为
n
5
\frac{n}{5}
5n
跑一遍最大流,如果结果是n那就fair,否则就unfair
拓扑排序
E. Minimal Labels
题意:
思路: 考虑按照入度进行拓扑排序,但是要求字典序最小,所以排序的时候用优先队列维护最小的下标
数据结构
线段树
F. Frogs and mosquitoes
题意:
思路: 坐标离散化,线段树维护某点能到达的最右点的坐标
李超线段树
F. Lena and Queries
题意:
思路:
虽然是一眼李超线段树,但是李超线段树不支持删除操作,所以需要线段树分治来离线一下
但是!可以凸包做,很显然,我不会计算几何
最小生成树
F. Magic Matrix
题意:
思路: 这有啥思路啊,就最小生成树
动态规划、
https://codeforc.es/contest/845/problem/F
题意:
D. Two Melodies
题意:
思路: 枚举中间点
m
i
d
mid
mid 和
j
j
j,
f
[
i
]
[
j
]
f[i][j]
f[i][j]表示区间
[
i
,
j
]
[i,j]
[i,j] 上
[
i
,
k
]
,
[
k
+
1
,
r
]
[i,k],[k+1,r]
[i,k],[k+1,r]两个区间最长子序列和
n
1
[
x
]
n1[x]
n1[x] 表示
x
x
x 的最长子序列,
n
2
[
x
]
n2[x]
n2[x] 表示
a
i
%
7
a_i\%7
ai%7的最长子序列,所以
f
[
i
]
[
j
]
=
m
a
x
(
f
[
i
]
[
j
]
,
n
1
[
x
+
1
]
+
1
,
n
1
[
x
−
1
]
+
1
,
n
2
[
x
%
7
]
+
1
f[i][j]=max(f[i][j],n1[x+1]+1,n1[x-1]+1,n2[x\%7]+1
f[i][j]=max(f[i][j],n1[x+1]+1,n1[x−1]+1,n2[x%7]+1
然后再让
f
[
j
]
[
i
]
=
f
[
i
]
[
j
]
f[j][i]=f[i][j]
f[j][i]=f[i][j]就把区间调转一下
单调队列优化
F. Mice and Holes
题意:
思路:
f
[
i
]
[
j
]
f[i][j]
f[i][j]表示前i个洞进前j个老鼠的最小贡献,
s
u
m
[
i
]
[
j
]
sum[i][j]
sum[i][j]表示前j个老鼠进第i个洞的贡献
f
[
i
]
[
j
]
=
m
i
n
(
f
[
i
−
1
]
[
j
]
,
f
[
i
]
[
k
]
+
s
u
m
[
i
]
[
j
]
−
s
u
m
[
i
]
[
k
]
)
f[i][j]=min(f[i-1][j],f[i][k]+sum[i][j]-sum[i][k])
f[i][j]=min(f[i−1][j],f[i][k]+sum[i][j]−sum[i][k])
背包
E. Selling Souvenirs
题意:
思路:
首先讲一下二分解法:
首先,重量只有三种,把三种按价格排序
枚举其中一种,另外两种的价格会形成一个单峰函数,把这个函数二分就可以得到这个函数的平台
其次,看到了一个很有意思的题解(已测,能过)
E. Thief in a Shop
题意:
思路: 把
a
i
a_i
ai sort之后,枚举空间大小,然后取min,
f
(
i
)
f(i)
f(i)表示选价值为i的物品时的最小物品数量
状压
E. Another Sith Tournament
题意:
思路: 状压
树形
E. Chemistry in Berland
题意:
思路:
数论
线性基
G. Shortest Path Problem?
题目:
思路: P4151 [WC2011] 最大XOR和路径这个题是求最大异或和,cf的这个是最小异或和,可以先做完那个然后顺便把这个ac了
计数
E. Colored Balls
题意:
思路: 分成
x
,
x
+
1
x,x+1
x,x+1两个部分计数,看看是不是能分成
x
,
x
+
1
x,x+1
x,x+1两个部分,然后求和
F. Couple Cover
题意:
思路: 暴力枚举每一个
a
i
a_i
ai然后枚举
k
∗
a
i
k*a_i
k∗ai加进去
答案就是全选
n
∗
(
n
−
1
)
n * (n-1)
n∗(n−1)减去达不到的
n
u
m
[
p
−
1
]
num[p-1]
num[p−1]
筛
F. Four Divisors
首先,这个题,我用
M
e
i
s
s
e
l
–
L
e
h
m
e
r
Meissel–Lehmer
Meissel–Lehmer过的,但是好像说是可以min25筛(能不用脑子为什么要用脑子呢)
(min25筛就交给以后的我再学习吧)
题意:
思路: 这个很显然可以分成两个东西进行讨论
1、
p
3
p^3
p3
2、
p
1
∗
p
2
p_1*p_2
p1∗p2
这样就可以用这个
M
e
i
s
s
e
l
–
L
e
h
m
e
r
Meissel–Lehmer
Meissel–Lehmer算法筛出来了,记一下时间复杂度
字符串
KMP
G. Anthem of Berland
题意:
思路: kmp上dp
首先
f
[
i
]
f[i]
f[i]肯定是从前面转移过来的,但是他不一定是
f
[
i
−
m
+
1
]
+
1
f[i-m+1]+1
f[i−m+1]+1,就是说他可能有一个共同的前缀,所以就是他是从他前一个失配指针位置上传过来的
g
[
i
]
=
m
a
x
(
g
[
i
]
,
g
[
i
−
(
m
−
j
)
+
1
]
+
1
)
,
f
[
i
]
=
m
a
x
(
f
[
i
]
,
g
[
i
]
)
g[i] = max(g[i],g[i - (m-j)+1]+1),f[i]=max(f[i],g[i])
g[i]=max(g[i],g[i−(m−j)+1]+1),f[i]=max(f[i],g[i])
F. String Compression
题意:
思路“ KMP上dp
trie树
E. Beautiful Subarrays
首先:好题,好典
题意:
思路: 前缀和,trie树上统计某个前缀和个数,然后插入,反复重复这个过程
位运算
F. Xors on Segments
题意:
结论: 定义
f
(
x
)
=
(
1
∧
2
∧
3
∧
4...
∧
x
)
f(x) = (1\wedge2\wedge3\wedge4...\wedge x)
f(x)=(1∧2∧3∧4...∧x)
则
f
(
r
)
∧
f
(
l
−
1
)
=
f
(
l
,
r
)
f(r)\wedge f(l - 1) = f(l, r)
f(r)∧f(l−1)=f(l,r)
思路: 预处理前缀和,离线,枚举 a i a_i ai, n 2 n^2 n2枚举出 a i − a j a_i-a_j ai−aj 的区间xor,枚举 l j , r j l_j,r_j lj,rj 确定最大值
构造
思维
E. Fire in the City
题意:
思路: 二分
G. Tree Queries
题意:
思路: 把第一个黑色点设为根节点
那么最小下标只会出现在三个位置
1、x到根节点的路径上
2、x到某黑色点y的
l
c
a
lca
lca路径上
3、某黑色点y到x的
l
c
a
lca
lca路径上
那么我们可以观察到,其实也可以变成三段:
1、
l
c
a
lca
lca到根
2、x到
l
c
a
lca
lca
3、y到
l
c
a
lca
lca
转换一下思路,就是说:
如果是1的话,那么也就是x到根,也是y到根
如果是2的话,那么其实也是x到根
但是如果是3的话,那么就是y到根
那么我们就能看出来,其实就是x和y到根节点的最小下标
做法就是: 找到在第一个黑色节点确定的时候,dfs求出每个点到根节点的路径上的最小答案,添加黑色节点的时候,
r
e
s
=
m
i
n
(
r
e
s
,
a
[
x
]
)
res = min(res,a[x])
res=min(res,a[x]),查询的时候
l
a
s
t
=
m
i
n
(
a
n
s
,
a
[
x
]
)
last =min(ans,a[x])
last=min(ans,a[x])
F. Ants on a Circle
题意:
结论: 对于两个球碰撞(不记损失),相当于每个球在继续沿着当前的运动轨迹盒速度前行,但是换球了
思路: 所以根据上述结论可以得知,我们只需要知道其中一个球的位置就可以进而推出其他球的位置了
F. Card Game
题意:
思路:
先讲正常思路:tag网络流
有个很神奇的思路: