首页 > 其他 > 详细

CF1305G

时间:2020-09-12 12:56:27      阅读:41      评论:0      收藏:0      [点我收藏+]

CF1305G [* hard]

给定 \(n\) 个数 \(a_i\),并生成图 \(G\)

对于 \((i,j)\),若 \(a_i~ \textrm{and}~ a_j=0\),那么连接 \(i\to j\)

现在每个点都要被加入集合 \(S\),有两种方式加入集合:

  1. 直接加入集合 \(S\),贡献为 \(0\)
  2. 对于 \(u\),选择这个与这个点有边的点 \(v\),然后将 \(u\) 加入集合,贡献为 \(a_v\)

最大化贡献。

\(n\le 2\times 10^5,a_i\in [0,2\times 10^5]\)

Solution

神仙题...我完全没想到点子上。

考虑建一张图,对于 \((i,j)\)\(a_i ~\mathbf{and}~a_j=0\) 就连边 \(i\to j\)

同时我们加入一个点权值为 \(0\)

然后我们让每条边的权值为 \(a_i+a_j\)

不难发现答案是边权和减去点权和。

于是从大到小枚举 \(a_i+a_j=w\),然后枚举 \(w\) 的子集 \(x\),连接 \(x\)\(w\oplus w\) 即可。

复杂度 \(\mathcal O(3^{18}\times \alpha)\)

可以考虑 B 开头的生成树算法,每次在一个连通块选一个最大出边连出去,然后可以证明合并次数不超过 \(\log\) 次。

于是对每个元素保留最大出边即可,这个等价于满足为其取反子集的最大值,可以用 dp 算。

每轮都做一次这个 dp 即可,复杂度 \(\mathcal O(2^{18}\log(w) \alpha(w))\)

CF1305G

原文:https://www.cnblogs.com/Soulist/p/13656469.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!