首页 > 其他分享 >CF1618FG

CF1618FG

时间:2024-05-20 20:07:57浏览次数:22  
标签:wc 二进制 添加 物品 CF1618FG ldots 翻转

闲的想做道 *2000,于是找到了 CF1618F。
wc,我怎么会了。
o,只有绿啊,没事了。
再看看 G 吧。
wc,我怎么又会了???
wc,这有蓝???

1618F

首先,我们发现对于一个合法二进制数添加 \(0\),相当于去除末尾所有的 \(0\) 后再翻转,即翻转后会变成 \(1\ldots 1\) 的形式。

引理:二进制数如果在非第一次操作时被添加一个 \(0\),相当于将二进制数翻转。

对于给出的二进制数 \(1\ldots 0\),无论第一次操作添加什么数,都会变成 \(1\ldots 1\)。此后如果添加 \(0\),根据起初的结论,相当于将二进制数翻转。

若给出的是 \(1\ldots 1\),可以归纳到上面的那种情况中。

于是我们对第一次操作分类讨论进行的是哪种操作,设得到的数为 \(s\)。

现在有两种操作:

  • 将 \(s\) 翻转。

  • 将 \(s\) 翻转后在最高位添加 \(1\)。

两种操作结合起来不难发现相当于可以在 \(s\) 的首尾加任意个 \(1\),并且可以翻转。由于 \(s\) 的数位不会很多,暴力做一下就行。

1618G

一眼了。

对于每个物品来说,它能换得的最大价值可以通过一个链状的结构表示出来。

所以对于 \((n+m)\) 个物品排序,相邻的两个物品 \(a,b\),\(a\rightarrow b\) 当且仅当 \(a\le b\le a+k\),于是一个物品能获得的最大价值就是它所在链的顶部。如果一条链上 \(x\) 个物品被初始获得,那么这条链对答案的贡献就是链的前 \(x\) 个物品的价值。一开始想的用 set 启发式合并,但是查询太慢了,看题解才发现可以前缀和。

至于多测,离线以后把链合并一下就行。怎么合并?用优先队列维护两个链之间的差就行。

标签:wc,二进制,添加,物品,CF1618FG,ldots,翻转
From: https://www.cnblogs.com/BYR-KKK/p/18202709

相关文章