Codeforces Round #514 (Div. 2)题解
A
喵,直接模拟。
B
枚举所有盖章时的,合法的,左上角的位置。能盖的话就盖一下。最后check一下图案是否相等即可
C
- 一轮一轮的扔。
- 如果\(len \geq 4\), 扔掉\(1,3,5,7....\)的位置。
- \(len=3\), 扔\(2,1,3\)
- \(len=2\), 扔\(1,2\)
- \(len=1\), 扔\(1\)
为什么这样构造呢?因为\(x,x+1\)肯定是互质的,所以我们先扔掉所有奇数。这样我们才可以在\((len+1)/2\)轮后使得所有数字的\(gcd\),乘\(2\)。
D
- 二分半径\(r\)
- 那么,圆心一定在直线\(y=r\)上啦。
- 对于每个点,圆心合法的位置是一个区间,判断区间交是否为空即可。
- 为什么可以二分?因为\(r\)越大,每个\(r\)对应的合法区间就越长吖。
E
比赛的时候70分钟都没A掉。打得烂!
- 我们先考虑一条链。对于每个点,维护它最远能往上跳多远,那么每个点都会对应着一个区间\([l,r]\),现在我们需要选择最少的区间使得整个链都被覆盖。这是很经典的贪心问题啦!
- 这个题,无非是把链的问题放在了树上。考虑节点\(u\),我们用\(dp[u]\)表示覆盖\(u\)的子树,最少需要几条路径,\(low[u]\)表示,\(u\)的子树中,最高能跳到哪一层。
转移:
dp[u] = max{dp[v]}; low[u] = min{low[v]};if (low[u] > dep[u]) dp[u] ++, low[u]=up[u];