Codeforces Round #220 (Div. 2) ABCD

题目链接

代码链接

A:

从点s能走到点t必须满足他们的x坐标之差是a的倍数,y坐标之差是b的倍数,并且这两个倍数之差是偶数(如果是奇数一定无法到达t点),然后还要判断是否s点在x维或y维是否有活动范围,如果一步都无法跨出显然也是不行的。枚举4个角落作为t点取最小值即可。

B:

这道我写的dp。设状态f[N][2]表示到第i个数为止,第i个数还能否用于后面的合并,的最大合并数量以及最大合并数量对应的方法数,开一个pair<int,lld>保存。则:

f[i][0] = f[i-1][1]   (s[i]+s[i-1]==9)

f[i][1] = f[i-1][1]+f[i-1][0]

答案为 (f[len][0]+f[len[1]]).second

这里的'+'号看做两个状态的合并。由于没有‘0’,所以不需要对9特殊处理。

C:

题目说明了如果有环应该怎样处理,那么完全就当作无环DAG来考虑问题就很简单了,dfs记忆化以每个格子作为起点时的最大值。

D:

由于每个节点最多只会被增删一次,最多100W个节点。增删操作,因此用Treap就足够了。貌似他们都是二分+树状数组AC的,代码简短有力高大威武啊。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值