Codeforces Round 889 (Div. 1) 题解

A1. Dual (Easy Version)

https://codeforces.com/contest/1854/problem/A1

题意

给定一个长度为 n 的序列 a1,a2,,an,你可以做以下操作:

  • 选定两个下标 i,j(1i,jn)i,j 可以相同,然后 aiai+aj

要求构造一种操作方案,使得 a1a2an操作次数不得超过 50

1n20,20ai20

题解

其实 50 次的限制很松。

首先如果没有正数,那么直接做一遍后缀和即可,次数 (n1=)19

如果有正数,那么随便选一个正数,然后不断自己加自己,直到大于一个 20 的数(代码里选的是 45)。

然后让负数加上这个处理完的正数,做一遍前缀和即可,操作次数最多 (6+n1+n1=2n+4=)44 次。

https://codeforces.com/contest/1854/submission/216383173

A2. Dual (Hard Version)

https://codeforces.com/contest/1854/problem/A2

题意

给定一个长度为 n 的序列 a1,a2,,an,你可以做以下操作:

  • 选定两个下标 i,j(1i,jn)i,j 可以相同,然后 aiai+aj

要求构造一种操作方案,使得 a1a2an操作次数不得超过 31

1n20,20ai20

题解

31 次操作刚好卡满。

首先前缀/后缀和最少需要 (n1=)19 次。

还剩下 3119=12 次。

分三种情况讨论(赛时就是没想到,寄在这了):

  • 如果都是 0 的数,直接做前缀和;如果都是 0 的数,直接做后缀和。

  • 如果正数的个数 7,那么先将绝对值最大的负数自加 5 次(至多为 32),再加到这些正数上,就可保证所有的数都是非正数了;如果负数的个数 7,那么先将绝对值最大的正数自加 5 次(至少为 32),再加到这些负数上,就可保证所有的数都是非负数了。次数刚好是 7+5+19=31 次。

  • 否则正数和负数的个数都至少为 8,所以正数和负数的个数最大值也只能取到 12,用绝对值最大的加即可。次数也是 12+19=31 次。

https://codeforces.com/contest/1854/submission/216386326

B. Earn or Unlock

https://codeforces.com/contest/1854/problem/B

题意

有一个长度为 n 的序列 a1,a2,,an,一开始只有 a1 是解锁的,其他的都是锁定的。你有一个动态的下标 x,初始为 1

你要重复做以下操作:

  • 如果 ax 是锁定的,那么直接结束所有操作。

  • 解锁接下来 ax 个数或将得分加上 ax

  • xx+1

求最大得分。

1n105,0a1,a2,,ann

题解

考虑暴力进行可行性 DP,设 fi,j 表示现在考虑到 ai,解锁了前 j 个数是否可以实现,转移方程 fi,j=fi1,j OR fi1,jai

初始状态 f0,1=1,注意在转移完 fi 的时候最后要将 fi,i 赋值为 0!!!因为这样无法解锁 ai+1,赛时就寄在这了。

很显然可以使用 bitset 优化,如果 fi,j=1 那么得分至少为 a1+a2++aij+1,因为 fi,i+k(k>0) 会被后边的算到,所以不用在 i 考虑,只需要考虑 fi,i=1 的贡献即可。特别的,DP 到 n 的时候要考虑 fn,n2n

2n+1 以上的就是无效的,因为这样一定可以减去几个数使得其 2n

时间复杂度 O(n2w)

https://codeforces.com/contest/1854/submission/216387677

posted @   CountingGroup  阅读(223)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示