codeforces图论
注:本文的分数为clist分数/Codeforces分数
C. Alyona and the Tree
分数:1700/1600
思路:
e
d
v
ed_v
e d v 表示
v
v
v 节点的树上前缀和,
n
d
v
nd_v
n d v 表示
v
v
v 节点的权值。对于任意节点都有
e
d
v
−
e
d
u
≤
n
d
v
ed_v-ed_u \le nd_v
e d v − e d u ≤ n d v ,所以移项后等于
e
d
v
−
n
d
v
≤
e
d
u
ed_v-nd_v \le ed_u
e d v − n d v ≤ e d u 。故我们只需要判断一个点
v
v
v 上面的祖先节点中的最小权值是否小于它即可。 最后注意,如果一个节点不满足要求,需要删掉这棵子树,我们的处理方式可以从下到上。
E. New Reform
分数:1700/1600
思路:
一个连通块内有一个环就一定不会有任何点孤立,没有环的就是一棵树,则会有一个点孤立。 用类似tarjan的方法判环即可。
D. Lakes in Berland
分数:1700/1600
思路:
搜索水题 第一个dfs找坑并且记录起点与大小 第二个dfs填坑。
C. Peaceful Rooks
分数:1702/1700
思路:
每个车将会占据一个行也会占据一个列,也就是有两个直接的主对角线格子可以选择。 如果有两辆车同时可以占据两个主对角线格子,那么就会形成一个环,让
a
n
s
ans
an s +1。 使用了并查集判断二次占据。
C. Anna, Svyatoslav and Maps
分数:1716/1700
思路:
题目有点绕,意思就是在原序列p中选一段子序列能够让走子序列的路径和等于原序列(每两个相邻的点走最短路)。 首先是起手floyd,这不用解释 其次考虑一个点j什么时候能被删掉
d
i
s
[
l
a
s
t
]
[
n
d
i
+
1
]
=
=
d
i
s
[
l
a
s
t
]
[
n
d
i
]
+
d
i
s
[
n
d
i
]
[
n
d
i
+
1
]
dis[last][nd_{i+1}] == dis[last][nd_{i}] + dis[nd_i][nd_{i+1}]
d i s [ l a s t ] [ n d i + 1 ] == d i s [ l a s t ] [ n d i ] + d i s [ n d i ] [ n d i + 1 ] ps:除了题意很绕,解法还是很直觉的。
B1. Candy Party (Easy Version)
分数:1720/1700
思路:
每个点都给出一个也都接收一个,最后的送入送出图必为一个简单环。 如果平均值不是整数必然No。 设每个数字与平均值的差值为
s
u
b
i
sub_i
s u b i ,假定
s
u
b
i
>
0
sub_i>0
s u b i > 0 ,如果
s
u
b
i
sub_i
s u b i 可以加上一个数字后等于
2
2
2 的整数次幂,则可以完全送出。 经过观察只有一个数字是连续的0001111000段才能满足要求,那么可以看到,这个送来的数字只能为
l
o
w
b
i
t
(
s
u
b
i
)
。
lowbit(sub_i)。
l o w bi t ( s u b i ) 。 所以
s
u
b
i
+
l
o
w
b
i
t
(
s
u
b
i
)
sub_i+lowbit(sub_i)
s u b i + l o w bi t ( s u b i ) 为2的整数次幂即可。 最后记录送入和送出的个数,要求所有的送入送出记录都为0。 而对于等于均值的,送入任意
2
x
2^x
2 x 都可以立刻送出,无需考虑。 ps:accmulate这个求和函数赋予的初始值需要也开ll,否则默认int会死的很惨。
A. Pavel and barbecue
分数:1720/1700
思路:
题意又是比较绕,就是说每个串都要在每个位置烤过两次,一次正一次反。 因为会形成圆排列,如果圆排列的个数不是1,则
a
n
s
=
圆排列的个数
+
(
(
∑
i
n
b
[
i
]
%
2
)
=
=
1
)
ans=圆排列的个数+((\sum_i^n b[i] \%2)==1)
an s = 圆排列的个数 + (( ∑ i n b [ i ] %2 ) == 1 ) ,否则显然只需要关注
b
[
i
]
b[i]
b [ i ] 的和即可
B. Doremy’s Connecting Plan
分数:1700/1700
思路:
因为一个连通块内的点共享点权和,所以相当于满足要求就合并到编号小的点上。 想到如果最后是Yes,那么所有的点都会合并到点1这个集合上。 那么是否能按照某个顺序直接判断每个点与1的点权和相连即可判断是否为最终集合呢? 如果一个点能与1相连则有
i
∗
c
≤
S
1
+
S
i
i*c \le S_1+S_i
i ∗ c ≤ S 1 + S i ,移项之后有
i
∗
c
−
S
i
i*c-S_i
i ∗ c − S i ,所以只要依次合并这个式子最小的点集即可。 最后考虑是否会产生漏解,即是否出现:所有剩余点集无法与1合并,但是某几个点集能合并到一起后与1合并的情况呢? 可以推导出,如果i,j不能和1相连则i,j必不能相连。 推导式子见洛谷
D. Mouse Hunt
分数:1700/1700
思路:
n个点n条边而且是由点向点链接,必形成内向基环树森林。 每个基环树分别记录它的权值即可。
B. Longtail Hedgehog
分数:1700/1600
思路:
不太好想的一道拓扑排序 首先是
u
−
>
v
(
u
>
v
)
u->v(u>v)
u − > v ( u > v ) 的边是无效边,所以可以直接删去,这样建出来的图一定是非环图。 然后就拓扑dp即可了,每个点都计算一下答案。
D. Beautiful Graph
分数:1700/1700
思路:
二分图的思维题 如果一个连通块能分成2部图,则
a
n
s
ans
an s 将会乘以
2
左部顶点数
+
2
右部顶点数
2^{左部顶点数}+2^{右部顶点数}
2 左部顶点数 + 2 右部顶点数
A. DZY Loves Physics
分数:1700/1700
思路:
首先一个环一定比一条链更差,因为多了一条边。 其次短链一定比长链优,因为要想原链密度减大,需要加入一条密度更大的链,但是反过来想,如果密度最大的链,不过加上那条链都不会增加密度了,所以选择最大密度的链即可。 详细推导请看洛谷
B. 3-Coloring
分数:1770/1700
思路:
考虑黑白格子的划分,这里提供一种不用思考坐标转化规律的代码。(其实判断行列和奇偶就可以划分黑白块了)
queue< pii> q1;
queue< pii> q2;
forn ( i, 1 , n, 1 ) {
int cnt = i % 2 ;
forn ( j, 1 , n, 1 ) {
if ( cnt++ % 2 == 1 )
q1. push ( { i, j } ) ;
else
q2. push ( { i, j } ) ;
}
}
我们可以在黑块放1,白块放2,如果1放完了还不能放2,我们就在黑块放3,以此类推。至于不能放3那就随便放。
链接:
分数:
思路:
链接:
分数:
思路:
链接:
分数:
思路:
链接:
分数:
思路:
链接:
分数:
思路:
链接:
分数:
思路:
链接:
分数:
思路:
链接:
分数:
思路:
链接:
分数:
思路: