Day1
A
实际上是把某一个数拆成若干个数之和,使得这若干个数乘积最大。显然尽量拆成 3 3 3,如果 m o d 3 = 1 \mod 3=1 mod3=1则拆两个 2 2 2, m o d 3 = 2 \mod3=2 mod3=2则拆一个 2 2 2。
B
分类讨论+贪心
- 首先,如果当前是干扰器,则能捡就捡,干扰器个数 s u m sum sum加 1 1 1。
- 记录之前
*#
的数量 f l g 1 flg1 flg1和回头路需要几个 f l g 2 flg2 flg2干扰器( f l g 2 flg2 flg2只可能是 1 1 1或 2 2 2)。然后如果当前的干扰器足够回头路使用,那么把之前*#
的*
捡回来。 - 然后如果当前是干扰器,如果无法通过则 b r e a k break break,否则更新 f l g 1 , f l g 2 flg1,flg2 flg1,flg2和 s u m sum sum。
可能有问题,最好看官方题解。
C
所求答案一定是最长(最短)的两条链长度之积。
求出 f , g f,g f,g分别表示每个点子树中的最长链和去掉这棵子树后的最长链。
只考虑求最长链之积(最短链可以把边权取负再跑一遍),显然两条链可以被某条边分割,所以 a n s = m a x { f i × g i ∣ i ≠ r o o t } ans=max \{f_i \times g_i | i \neq root\} ans=max{fi×gi∣i=root}。
f i f_i fi很好求,有两种转移方式
- f s o n f_{son} fson转移过来;
- i i i向下的最长次长链之和。
g i g_i gi要用到换根 D P DP DP的思路,有四种转移
- g f a i g_{fa_i} gfai;
- f a fa fa去掉 i i i这个子树后的最长链加次长链,所以之前要记录第三长链;
- f a fa fa去掉 i i i这个子树后的最长链加 f a fa fa向上的最长链;
- f a fa fa去掉 i i i这个儿子后的儿子子树中的最长链。
维护 i i i向上的最长链与维护 g g g相似。
Day2
A
贪心,把没有固定位置的尽量往前放。
B
用字典树把字符串排序后,算出给出的串由哪 k k k个串组成。然后算一下这个序列的排名即可。
C
考虑枚举选择哪些行,然后我们知道了哪些列是合法的,设数量为 t t t。
首先如果只选一列,那么一定合法,且方案数是 t t t。
考虑选超过两列的情况。如果已经选了两列,那么就知道了每一行的单调增减情况。设 f s , i f_{s,i} fs,i表示每一行的单调增减是 s s s,选了至少两列且最后一列是 i i i的方案数。转移枚举两列转移即可。
考虑这样做的复杂度,由于最多 c c c列合法,那么可能的 s s s最多有 ( c 2 ) {c \choose 2} (2c)种,转移次数也最多是 ( c 2 ) {c \choose 2} (2c)的,所以总复杂度 O ( 2 r c 2 ) O(2^rc^2) O(2rc2),可以通过此题。