专栏文章

题解 CF2165C Binary Wine

CF2165C题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@min1infx
此快照首次捕获于
2025/12/01 19:02
3 个月前
此快照最后确认于
2025/12/01 19:02
3 个月前
查看原文

题解 CF2165C Binary Wine

题意

给定长度为 nn 的数组 aa,你可以进行若干次操作,每次花费 11 代价使 aa 中的某个元素增加 11
qq 次询问,每次给定一个 cc,求使得下面条件成立的最小代价:
  • 存在一个长度为 nn 的数组 bb 使得 1in,0biai\forall 1\le i\le n,0\le b_i\le a_i,且 b1b2bn=cb_1\oplus b_2\oplus\dots\oplus b_n=c
数据范围:多测,n5×105\sum n\le 5\times 10^5q5×104\sum q\le 5\times 10^4,值域 [0,230)[0,2^{30})

做法

按位考虑。首先一位上出现多个 11 显然是不优的。
考虑从高往低枚举每一位。设 aa 的各项的这一位求和为 AAbb 的这一位为 BB,则分三种情况:
  • A>BA>B 时,必然能拿出一个 aia_ibb 的该位,同时还可以拿出另一个 aia_i 则可以覆盖 bb 的所有更低位,直接停止枚举输出答案;
  • A=BA=B 时,必然能拿出一个 aia_ibb 的该位,把该 aia_i 的该位减掉放回,然后接着枚举后面的位;
  • A<BA<B 时,拿不出一个 aia_i 了,这时就需要加。而加是要代价的所以我们直接取出 aa 里面最大的拿来加。加完了之后该 aia_i 就进入第二种情况,即留下一个 00
综上,算法思路就是用一个大根堆维护前 logV\log V 大的 aia_i,然后按上面三种情况讨论,其中后两种都每次取堆顶。

评论

0 条评论,欢迎与作者交流。

正在加载评论...