8月30日 AtCoder Regular Contest 101 题目链接:https://arc101.contest.atcoder.jp/
C - Candles
思路: 比较水的一题,发现点燃的$k$根蜡烛一定是相邻的。于是我们之间枚举k根蜡烛的位置就好了。
代码:
1 |
|
D - Median of Medians
思路: 好题。。
有一个很神奇的地方就是这题所求的Median of Medians是满足二分性的。首先我们有$n*(n+1)/2$个连续子串,我们设二分的值为$x$,如果至少有$n*(n+1)/4$个 中位数大于等于$x$的连续子串,那么答案就一定是大于等于$x$的,否则就是小于$x$,于是我们就可以根据这个进行二分。
接下来我们的问题就是如何求 中位数大于等于$x$的连续子串 的个数。我们可以将大于等于$x$的数视为1,将小于$x$的数视为-1,然后维护前缀和,记为$c[i]$。那么对于子串$[l, r]$,如果$c[l]<=c[r]$那么这个子串的中位数就是大于$x$的。对于符合要求$[l, r]$的个数,不难想到使用树状数组进行维护。
代码:
1 |
|
E - Ribbons on Tree
思路: 也是一道很好的题目,是一个计数类的树形DP。
看完题目后就觉得像是一个计数类的DP,于是按照常规的计数类DP思考如何转化和如何设计状态。首先是可以用容斥的思想,$ans=$所有情况 $-$ 至少一条边未覆盖情况 $+$ 至少两条边未覆盖情况$…..$
那么问题就来了,如何计算 至少$k$条边未覆盖的情况数。如果我们知道$k$条未覆盖的边的具体位置,很容易想到这棵树被分为了$k+1$个互不连通的区域(这里是区域,不一定要联通)。对于一个含有$x$个节点的区域,这个区域的可能情况数量$g(x)$为: 那么如果我们知道了$k$条未覆盖的边的具体位置,这种情况的方案数就是$g(x_1)*g(x_2)….*g(x_{k+1})$,$x_i$就是第$i$个区域的节点数。
但实际上我们并不知道$k$条未覆盖边的位置,并且枚举这$k$条边的复杂度也是不满足要求的,这时我们就可以换一个思路,利用树形DP(虽然思路变了,但是上面的结论都是要用到的)。我们设$f[i][j][k]$为在$i$的子树中,$i$所在联通块大小为$j$,未覆盖边数的奇偶性为$k$($k$为0或1),$j$可能为0,此时表示$i$所在联通块为任意大小。方程的转移就看代码好了,实在是讲不清楚。最后答案就是$f[1][0][1]-f[1][0][0]$
代码:
1 |
|
F - Robots and Exits
思路:
代码:
1 |
|