题解:AT_agc043_c [AGC043C] Giant Graph

· · 题解

[AGC043C] Giant Graph

一道很有教育意义的题。

题目描述

感觉题目讲的很清楚了,建议读原题题面。

题解

首先观察一下题目的一些特殊性。注意到对于点 \left(x,y,z\right),其代价是 \left(10^{18}\right)^{x+y+z} 这件事情非常鬼畜,不妨从这一点入手。

类似很多 01-trie 上贪心的题目进行考虑,由于 10^{18} 远大于 n,所以不难发现我们肯定要尽量选择 x+y+z 大的点。于是就有了一个 \operatorname{O}(n^3) 的贪心,把每一个点都建出来,然后按照 x+y+z 从大到小选点,能选就选。

根据上面这个贪心,我们可以把无向边 \left(u,v\right) 变为一条有向边,从编号小的点连向编号大的点。这样整张图就变成了 DAG

继续分析 最大权独立集 这个东西。令 f_{x,y,z} 表示点 \left(x,y,z\right) 有没有选,我们规定 f_{x,y,z}=0 表示选,其他情况都表示不选。设 G 表示这些 三维 的点通过这三张图连出的图,由于这是一个 DAG ,所以可以反拓扑序 dp,转移如下:

f_{x,y,z}=\operatorname{mex}_{\left(\left(x',y',z'\right),\left(x,y,z\right)\right)\in G} f_{x',y',z'}

如果出边连向的点是已经选择(即 f 值为 0)的,那么当前点的 \operatorname{mex} 值一定不会为 0,这是显然的。所以这样转移可以保证不会选择相邻的,而且我们是从权值大的点开始 dp 的,所以保证了权值最大。

观察一下,注意到 fdpSG 函数的计算方式很像(这也是这道题最有教育意义的地方),实际上这两个可以说一模一样。那么便考虑能否像 SG 函数一样把 若干维分开 进行 dp,最后异或在一起。

考虑 SG 函数在什么时候可以分开计算最后用异或合并,我们只要保证每一维都互不干扰。而这道题中三张图上的边都只会改变某一维的编号,所以说并不会互相干扰。于是我们可以直接拆开考虑。

设这三张图上点 xSG 值分别是 F(x),G(x),H(x),那么答案就是:

\sum_{x,y,z,F(x)\oplus G(y)\oplus H(x)=0} \left(10^{18}\right)^{x+y+z}

但这样依旧是 \operatorname{O}(n^3) 的,考虑优化.

F'(x) 表示在第一张图上 SG 值等于 x 的点的权值之和,G'(x)H'(x) 同理。那么答案式子变为:

\sum_{x,y}F'(x)\times G'(y)\times H'(x \oplus y)

直接暴力是 \operatorname{O}(n^2) 的,但 SG 函数的值最大是 \operatorname{O}(\sqrt m) 级别的。感性理解一下,对于一个 SG 函数值为 x 的点,其至少需要向 \left[0,x-1\right] 中每个权值的任意一个点连边,归纳的考虑,我们想要有一个 SG 值为 x 的点至少需要 \frac{x\times \left(x+1\right)}{2} 条边,所以 SG 值是 \operatorname{O}(\sqrt{m}) 级别的。

这样我们就可以直接枚举前面答案式中的 x,y 暴力计算了,时间复杂度 \operatorname{O}(m)

code

扩展

题目描述

在原题目的基础上,点由三维变成了 k 维,但每一维的图都是一样的(图会给定)。对于城市 \left(p_1,p_2,\cdots,p_k\right),其代价为 10^{n^k\left(p_1+p_2+\cdots+p_k\right)},依旧求最大权独立集。

1\le n\le 2\times 10^5,1\le k\le 10^{50000}, 1\le m\le 5\times 10^5

题解

首先这个权值显然是搞笑的,这道题怎么处理这个东西就怎么处理。至于权值计算可以用十进制倍增计算 n^k 然后费马小定理解决。

与这题一样,我们将其转化为 SG 函数的问题,由于这道题每一个维度图都一样,所以每一维的 SG 函数是一样的。

定义多项式运算:

A\cdot B=\sum_{i,x,y, x\oplus y=i} a_x\times b_y

SG 值为 x 的点权值和f_xF(x)=\sum_{i=0} f_i\times x^i,那么答案就是:

[x^0]F^k(x)

那么直接做的时间复杂度就是 \operatorname{O}(m\log k),这个式子显然可以用 FWT 优化,可以优化到 \operatorname{O}(\sqrt{m}\log \sqrt{m}\log k)

PS:这里有一个小 trick,可以直接对 k 进行十进制倍增,就不用写高精度了。

code