A
手玩一下可以发现大于等于2时, 的答案为
中 1 的数量和长度的和减去 2
原理是开头的 1*可以用一次 +2实现
当然我们也可以dp求出一定范围的答案,然后对 反复执行 -1 , /2的操作,直到落到范围内
B
显然所有的点和边构成了一个基环树森林,只要判断每一棵基环树,取最长的链加上环即可
C
二分图 匈牙利即可
D
数位dp
设计一个dp计算小于等于x的所有数含有1的和, 只用计算
我们从高位往低位枚举 的二进制位
假如这一位是 1 , 那么
当这位取0, 后面的 位都可以随便取,直接加上
中的 1 的个数即可
当这位取1,这个 1 的贡献为后面可以跟的数的个数, 显然就是后 位的值
假如这一位是0, 那么直接枚举到下一位即可
E
确定一个位置有没有贡献只用看相邻的两个点即可,修改子树时只用考虑子树根和其父亲节点
查询用树链剖分维护即可
F
总共的取值为
这个东西是调和级数 直接枚举即可
G
从 1 到 n 枚举, 使用神力的地点一定是消耗最大的k个点,因此从 1 到 n 枚举, 用 set 或者堆维护最大的k个即可
H
枚举对每一位操作的贡献, 取最大的加到原数组即可
I
显然是把最大的数移到最前面最大, 相同大小取操作次数少的
J
我们可以计算每个点的最大值
首先看 1 的限制, 每个点的最大值为往上,往右,往右上的最大距离的最小值,这个通过前缀和可以解决
接着看 0 的限制,每个点延长出的三条线会把右上的矩形分为两块,上面半块决定了最大高度,下面半块决定了最大宽度,同样可以前缀和维护
总复杂度O(n^2)
注意数组不要开太多, 题目内存有限,会mle
常数较小的O(n^2log) 也能通过,实现就是把 0 的限制换成二分
K
因为可以任意删边, 所以最后的联通块可以任意组合 显然是两个连通块数量最接近时最大
L
相当于删去所有桥, 我们关心的是删完后每个块有多少点
然后我们要尽量构造点数接近 (n >> 1) 的块, 这样才能让答案最大
显然类似01背包可以完成, 但是01背包的复杂度无法通过
考虑优化, 通过二级制组合, 把同样大小的块分组计算, 因为 本质不同的块的数量是 O(sqrt(n)) 的
所以总过程优化到 O(nsqrt(n))