Codeforces Round #236 (Div. 1)(A, B, C, D)

来源:互联网 发布:软件需求确认表 编辑:程序博客网 时间:2024/05/21 06:38

code链接:https://github.com/9974/Codeforces/tree/master/236div1

A

样例做法:从1连到n,再从2到n。。。。直到连了2*n+p。。不知道为啥。。

能合理解释的做法:显然图平均分布会更好,用优先队列,每次取出度最小的两个点连边即可


B

先统计题目给你的所有数的总的权值, 预处理每个前缀最大公约数

从后往前枚举, 统计一下当前最大公约数产生的影响, 如果影响为负数,那么就消去,

 权值减去这个负数,同时更新前缀最大公约数。

C

要对矩阵有一定的理解, A^k矩阵可以表示 对于任意的i走k步到j有多少种情况,这里题目只要考虑是否到达就可以了。

当k足够大时, 要使A^ k每个数都是正整数,也就是说从图中的每个点出发走k步能到达其它所有点,

 要注意题目说的一定存在A[s][s] > 0, 意思是可以原地停留,  那么  只要判这幅图是不是强连通就可以了。

D

先预处理处dp[i][j]表示 i个不同的数和为j的情况数(无序),  你可以用 背包dp,注意总共也不会超过50个数, O(50*n^2)

也可以O(n^2)预处理, 学习叉姐的做法

然后对于每个询问,枚举a_i-b_i的总和s, 剩下的n-s先放好, 然后把dp出来的k段用插空法插入到里面,情况数为C[k+n-s][k]

然后要考虑k段的顺序,那么就要乘以A[k](阶层)



1 0
原创粉丝点击