Comet OJ - 模拟赛测试 Day1&Day2

题目地址:day1 day2

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

code

B

分类讨论+贪心

  1. 首先,如果当前是干扰器,则能捡就捡,干扰器个数 s u m sum sum 1 1 1
  2. 记录之前*#的数量 f l g 1 flg1 flg1和回头路需要几个 f l g 2 flg2 flg2干扰器( f l g 2 flg2 flg2只可能是 1 1 1 2 2 2)。然后如果当前的干扰器足够回头路使用,那么把之前*#*捡回来。
  3. 然后如果当前是干扰器,如果无法通过则 b r e a k break break,否则更新 f l g 1 , f l g 2 flg1,flg2 flg1,flg2 s u m sum sum

可能有问题,最好看官方题解。

code

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×gii=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相似。

code

Day2

A

贪心,把没有固定位置的尽量往前放。

code

B

用字典树把字符串排序后,算出给出的串由哪 k k k个串组成。然后算一下这个序列的排名即可。

code

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),可以通过此题。

code

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值