这次比赛出了A,C两题,B题给跪了,犯了一个小小的错误。
B
我是这么做的,枚举每个黑格子,然后暴力走4个直角,统计找到的点的个数,当个数不等于总个数就是NO,遍历所有情况没有NO就是YES。
code
C
假如倍数是2, 并有序列2,4,8,16...... 这个数列的总个数为n, 很容易得出我们最多只能取n - n/2个数,即有n/2个不能选。
因此我们只要找到所有公比为倍数(K)的等比数列(这个等比数列必须保证取得长度最长), 每次剔除不能选的个数, 最后剩下的就是答案。
可以用set实现,代码比较短。
code
D
以1为根节点,根据题意约束,我们发现清零的方向必须是要从树的叶子往上到根节点。
我们先分析深度为2的树, 树的根为1。 求清除其孩子节点的最小次数的方法是: 先找到其孩子中所有负数的最小值X 和 所有正数的最大值Y, 则最小加1 次数为X, 最小减1 次数为Y 。
根据上述结论,我们可以从下往上逐步清零子树即可。
我们让数组a[u], b[u]表示让 以u为根的子树的所有节点都清零 所需要的加1和减1操作的次数。
具体清零子树u时,先清除其孩子节点,再清除u节点。
code
E
能出现斑点的图形就是能在该图形中(图形内部)找到一个点使得这个点到所有顶点距离相等的点center。理由很简单因为它是最后一个被覆盖的点。设center到顶点的距离为d
当然找到这个点之后要看除图形之外的点所形成的圆能不能覆盖这个center, 不能覆盖说明距离d合法,更新最大值。
我们可以对每3个点所构成的三角形(不能构成就说明3点共线,没有center点)考虑其外心的位置。
总结可得,以上的所要找的图形可以化简为2类:
1. 锐角三角形(center为其外心)
2. 两个对角都为直角的四边形(center在直角所对的一条对角线的中点)。
其它的图形均可以由以上2类拼接起来。
code