Codeforces Round #677 (Div. 3, CF1433)题解

文章目录

Solution

T1

直接暴力即可。用数学手法也可以。

T2

对于每两段连续的 1 1 1之间隔的 0 0 0的个数之和就是答案。

T3

首先,如果所有数都一样,显然输出 − 1 -1 1

否则,一定存在一个最大值能把其他数全部吃掉。我们只需要找到一个最大值,使得它的左边或它的右边不全是最大值即可。

时间复杂度 O ( n ) O(n) O(n)

T4

一道巧妙而有些水的构造题。

首先,我们将整个序列排序。如果这个序列所有数都一样,显然不行;否则我们找到最长的一段各个数均相等的前缀。然后,第一个数连向所有不在这个前缀中的数,然后最后一个数连向这个前缀中的所有数,除了第一个数

时间复杂度 O ( n ) O(n) O(n)。那个 n ≤ 5000 n≤5000 n5000有一点放水了。

T5

一道比较水的组合数学题。先设 m = n 2 m=\frac n 2 m=2n

扫描二维码关注公众号,回复: 12024399 查看本文章

首先,一共有 A n m × m ! A_{n}^m×m! Anm×m!种方案(如果不删去相同的方案的话)。

可以发现,{ 1 , 3 1,3 1,3}{ 2 , 4 , 5 2,4,5 2,4,5}与{ 2 , 4 , 5 2,4,5 2,4,5}{ 1 , 3 1,3 1,3}本质相同,于是先除以 2 2 2

接着,{ 1 , 3 , 4 1,3,4 1,3,4}与{ 3 , 4 , 1 3,4,1 3,4,1}, { 4 , 1 , 3 4,1,3 4,1,3}是本质相同的。对于一个集合有 m 2 \frac m 2 2m种,但是有两个集合,所以还要除以 ( m 2 ) 2 (\frac {m} 2)^2 (2m)2

于是答案为 A n m × m ! 2 × ( m 2 ) 2 \frac {A_{n}^m×m!} {2×(\frac {m} 2)^2} 2×(2m)2Anm×m!

为什么连逆元都不能考了?就搞个 n ≤ 20 n≤20 n20? 这样还有区分度吗……

花絮: 这题用哈希也能过!

T6

一道有一点点思维含量的 d p dp dp题。

首先,我们对于每一行均跑一遍 d p dp dp。状态设计为 d p i , j dp_{i,j} dpi,j,表示在这一行上,一共选了 i i i个数,这些数的和膜 k k k的值为 j j j时,这些数的和的最大值。

然后,对于每一行,对于所有的 i ≤ m 2 i≤\frac m 2 i2m,我们均存下所有的 d p i , j dp_{i,j} dpi,j。然后,对于多行我们再跑一遍分组背包就完了。

时间复杂度 O ( n m k ) O(nmk) O(nmk)

T7

一道不错的图论题。

首先,我们先跑出所有 x , y x,y x,y之间的最短路径(用 D i j k s t r a Dijkstra Dijkstra),然后枚举边(即把这条边的权值改为 0 0 0)。假设这条边是 u − > v u->v u>v,那么如果 x x x y y y的最短路径发生改变,那么一定变成了:

①从 x x x u u u,从 u u u v v v,从 v v v y y y
②从 x x x v v v,从 v v v u u u,从 u u u y y y

可以发现,我们只需要跑出分别以 u , v u,v u,v为源的最短路径,然后尝试变小 x x x y y y的最短路径即可。由于这是无向图,所以这种解法的正确性有了保障(在无向图中, a a a b b b的最短路径就是 b b b a a a的最短路径)

时间复杂度 O ( ( n + m ) ( k + m ) l o g m ) O((n+m)(k+m)logm) O((n+m)(k+m)logm),可以通过本题。

Code

咕咕咕

猜你喜欢

转载自blog.csdn.net/Cherrt/article/details/109198781