Codechef SUMCUBE
给定无向简单图 G = (V, E)(即不存在自环和重边),以及 k = 1, 2, 或3 。
求
$$ \sum_{S \subseteq V} f(S)^k, $$
其中 $f(S)$ 是两个端点都在 S 中的边的数量,即
$$ f(S) = \frac 1 2 \sum_{x \in S} \sum_{y \in S} [(x, y) \in E]. $$
解:
我们注意到 k 的取值只有 1, 2, 3,因此我们针对每一种取值单独考虑。
为了方便,我们把 $[(x, y) \in E]$ 简记为 $e_{xy}$。
由于是无向图,因此有 $e_{xy} = e_{yx}$。
由于 G 是无自环,因此有 $e_{xx} = 0$。
我们把 $[x \in S]$ 简记为 $s_x$。
我们记 $d_x$ 为节点 x 的度数,具体定义为
$$ d_x = \sum_{y \in V} e_{xy}. $$
为了方便计算,我们只考虑$ 2^k \sum_{S \subseteq V} f(S)^k $。
当 k = 1 时,
$$ 2 \sum_{S \subseteq V} f(S) = \sum_{S \subseteq V} \sum_{x \in S} \sum_{y \in S} e_{xy}. $$
交换求和顺序可得
$$ \sum_{S \subseteq V} \sum_{x \in S} \sum_{y \in S} e_{xy} = \sum_{x \in V} \sum_{y \in V} e_{xy} \sum_{S \subseteq V} s_x s_y = 2^{|V|-2} \sum_{x \in V} \sum_{y \in V} e_{xy} = 2^{|V|-2} 2|E|. $$
为了方便,我们记 $c_{11} = \sum_{x \in V} \sum_{y \in V} e_{xy} = 2|E|$ 。
时间复杂度 O(|V|+|E|) 。
当 k = 2 时,
$$ 4 \sum_{S \subseteq V} f(S)^2 = \sum_{S \subseteq V} \sum_{x \in S} \sum_{y \in S} \sum_{x' \in S} \sum_{y' \in S} e_{xy} e_{x'y'}. $$
注意到
$$ \sum_{S \subseteq V} \sum_{x \in S} \sum_{y \in S} \sum_{x' \in S} \sum_{y' \in S} e_{xy} e_{x'y'} = 2^{|V|-2} 2 c_{22} + 2^{|V|-3} 4 c_{211} + 2^{|V|-4} c_{1111}, $$
其中
$$ c_{22} = c_{11}, $$
$$ c_{211} = \sum_{x \in V} \sum_{y \in V} \sum_{y' \in V \setminus \{x, y\}} e_{xy} e_{xy'} = \sum_{x \in V} d_x (d_x-1), $$
$$ c_{1111} = \sum_{x \in V} \sum_{y \in V} \sum_{x' \in V \setminus \{x, y\}} \sum_{y' \in S \setminus \{x, y\}} e_{xy} e_{x'y'} = 4\left( |E|^2 + |E| - \sum_{x \in V} d_x^2 \right). $$
时间复杂度 O(|V|+|E|) 。
当 k = 3 时,
$$ 8 \sum_{S \subseteq V} f(S)^3 = \sum_{S \subseteq V} \sum_{x \in S} \sum_{y \in S} \sum_{x' \in S} \sum_{y' \in S} \sum_{x'' \in S} \sum_{y'' \in S} e_{xy} e_{x'y'} e_{x''y''}. $$
注意到
$$ \begin{aligned}
8 \sum_{S \subseteq V} f(S)^3
= & 2^{|V|-2} 4 c_{33} + 2^{|V|-3} ( 24 c_{321} + 8 c_{222} ) + \\
& 2^{|V|-4} ( 8 c_{3111} + 6 c_{2211_0} + 24 c_{2211_1} ) + \\
& 2^{|V|-5} 12 c_{21111} + 2^{|V|-6} c_{111111}.
\end{aligned} $$
其中
$$ c_{33} = c_{11} $$
$$ c_{321} = c_{211} $$
$$ c_{222} = \sum_{x \in V} \sum_{y \in V} \sum_{z \in V} e_{xy} e_{yz} e_{zx} $$
$$ c_{3111} = \sum_{x \in V} \sum_{y \in V} \sum_{y' \in V \setminus \{x, y\}} \sum_{y'' \in V \setminus \{x, y, y'\}} e_{xy} e_{xy'} e_{xy''} = \sum_{x \in V} d_x(d_x-1)(d_x-2) $$
$$ c_{2211_0} = c_{1111} $$
$$ c_{2211_1} = \sum_{x \in V} \sum_{y \in V} \sum_{y' \in V \setminus \{x, y\}} \sum_{y'' \in V \setminus \{x, y\}} e_{xy} e_{xy'} e_{yy''} = 4|E|^2 - c_{222} $$
$$ \begin{aligned}
c_{21111}
& = \sum_{x \in V} \sum_{y \in V} \sum_{y' \in V \setminus \{x, y\}} \sum_{x'' \in V \setminus \{x, y, y'\}} \sum_{y'' \in V \setminus \{x, y, y'\}} e_{xy} e_{xy'} e_{x''y''} \\
& = (2|E|+4) c_{211} + 2 c_{222} - 2 \sum_{x \in V} d_x^2(d_x-1) - 4 \sum_{x \in V} \sum_{y \in V} e_{xy} d_y (d_x-1)
\end{aligned}
$$
$$ \begin{aligned}
c_{111111}
& = \sum_{x \in V} \sum_{y \in V} \sum_{x' \in V \setminus \{x, y\}} \sum_{y' \in V \setminus \{x, y\}} \sum_{x'' \in V \setminus \{x, y, x', y'\}} \sum_{y'' \in V \setminus \{x, y, x', y'\}} e_{xy} e_{x'y'} e_{x''y''} \\
& = (2|E|)^3 - ( 4 c_{33} + 24 c_{321} + 8 c_{222} + 8 c_{3111} + 6 c_{2211_0} + 24 c_{2211_1} + 12 c_{21111} + c_{111111} )
\end{aligned} $$
剩下的问题即是求解 $c_{222}$ 。求出 $c_{222}$ 之后,其余值皆可在 O(|V|+|E|) 时间内求出。
$c_{222}$ 本质上是求简单无向图 G 的有序三元环个数,其值是 6 倍简单无向图 G 的无序三元环的个数。
对于三元环,可以用以下算法求得。
0. 记 $t = \sqrt{|E|}$。
1. 我们按照节点度数把所有节点 x 分成两类。一类节点度数 $d_x \le t$,剩下不满足条件的为另一类。
2. 对于节点度数 $d_x \le t$ 的节点 x ,我们枚举其连接的两个不同节点 y 和 z。判断 $e_{yz}$ 是否为 1,若是,则找到一个三元环。
我们根据 y 和 z 的不同情况进行讨论。
2.1 若$d_y \le t$ 且 $d_z \le t$。对于这种情况,我们的算法会计算到这个三元环 3 次,因此每找到一次,贡献为 2 。
2.2 否则若$d_y \le t$ 或 $d_z \le t$。对于这种情况,我们的算法会计算到这个三元环 2 次,因此每找到一次,贡献为 3 。
2.3 否则,即$d_y > t$ 且 $d_z > t$。对于这种情况,我们的算法会计算到这个三元环 1 次,因此每找到一次,贡献为 6 。
3. 节点度数 $d_x > t$ 的节点,最多有$|E|/t$个,我们暴力枚举节点度数大于 t 的三个节点,判断他们是否组成三元环。对于这种情况,我们的算法会计算到这个三元环 1 次,因此每找到一次,贡献为 6 。
可以发现, $c_{222}$ 的计算是本问题的关键,时间复杂度为 $O(|E|^{1.5})$。
Codechef SUMCUBE的更多相关文章
- Codechef SUMCUBE Sum of Cubes 组合、三元环计数
传送门 好久没有做过图论题了-- 考虑\(k\)次方的组合意义,实际上,要求的所有方案中导出子图边数的\(k\)次方,等价于有顺序地选出其中\(k\)条边,计算它们在哪一些图中出现过,将所有方案计算出 ...
- Codechef SEPT17
Codechef SEPT17 比赛链接:https://www.codechef.com/SEPT17 CHEFSUM code给定数组 a[1..n] ,求最小的下标 i ,使得 prefixsu ...
- 【BZOJ-3514】Codechef MARCH14 GERALD07加强版 LinkCutTree + 主席树
3514: Codechef MARCH14 GERALD07加强版 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 1288 Solved: 490 ...
- 【BZOJ4260】 Codechef REBXOR 可持久化Trie
看到异或就去想前缀和(⊙o⊙) 这个就是正反做一遍最大异或和更新答案 最大异或就是很经典的可持久化Trie,从高到低贪心 WA: val&(1<<(base-1))得到的并不直接是 ...
- codechef 两题
前面做了这场比赛,感觉题目不错,放上来. A题目:对于数组A[],求A[U]&A[V]的最大值,因为数据弱,很多人直接排序再俩俩比较就过了. 其实这道题类似百度之星资格赛第三题XOR SUM, ...
- codechef January Challenge 2014 Sereja and Graph
题目链接:http://www.codechef.com/JAN14/problems/SEAGRP [题意] 给n个点,m条边的无向图,判断是否有一种删边方案使得每个点的度恰好为1. [分析] 从结 ...
- BZOJ3509: [CodeChef] COUNTARI
3509: [CodeChef] COUNTARI Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 339 Solved: 85[Submit][St ...
- CodeChef CBAL
题面: https://www.codechef.com/problems/CBAL 题解: 可以发现,我们关心的仅仅是每个字符出现次数的奇偶性,而且字符集大小仅有 26, 所以我们状态压缩,记 a[ ...
- CodeChef FNCS
题面:https://www.codechef.com/problems/FNCS 题解: 我们考虑对 n 个函数进行分块,设块的大小为S. 每个块内我们维护当前其所有函数值的和,以及数组中每个元素对 ...
随机推荐
- 【面试 JVM】【第六篇】JVM调优
六部分内容: 一.内存模型 1.程序计数器,方法区,堆,栈,本地方法栈的作用,保存那些数据 可以画个大图出来,很清晰 jvm内存模型主要指运行时的数据区,包括5个部分. 栈也叫方法栈,是线程私有的,线 ...
- php 解决MySQL插入数据出现 Incorrect string value: '\xF0\x9F\x92\x8BTi...'错误
在项目中向MySQL插入数据时.发现数据插入不完整,通过调试,发现插入语句也没什么特殊的错误. 可是就是差不进去,于是就打开mysqli错误的调试 $ret = mysqli_query($this- ...
- javaweb 中的过滤器 包装器
过滤器要做的事情: 请求过滤器:完毕安全检查,又一次格式化请求首部或体.建立请求审计或日志 响应过滤器: 压缩响应流,追加或改动响应流创建一个全然不同的响应. 过滤器和servlet三个相似地 ...
- Eclipse打包Android项目时用到proguard.cfg后,出现的Warning:can't find referenced class问题的解决方式
Warning: can't find superclass or interface Warning: can't find referenced class 这两个问题的解决方法: 1.要把你项目 ...
- YII 多子域名同步登录
a.meylou.com和b.meylou.com不做登录.c.meylou.com这个专门做用户登录.c站登录之后a,b站点同时登录. 第一步:修改php.ini配置文件,把cookie_domai ...
- python-一个小练习
myseq = '''[a:1,b:2,c:3] [a:3,b:3,c:8] [a:7,c:2:m:7,r:4] [a:2,c:4:m:6,r:4] [a:3,b:2,c:7,o:5]''' def ...
- 【Java】Java代码经典错误清单
一.String 对照 == 和 equals.详细描写叙述例如以下 "=="操作符的作用 1)用于基本数据类型的比較,例如以下: byte(字节) 8 -128 - 127 0 ...
- js 时间戳精确值的问题
最近做一个多图上传的功能,通过name + 时间戳命名,结果发现时间戳竟然一样,一直以为是代码逻辑的问题,结果出错在时间戳的获取上了. 关于时间戳的获取方式: 1.Date.parse() var d ...
- webpack 构建多页面应用
如何使用webpack构建多页面应用,这是一个我一直在想和解决的问题.网上也给出了很多的例子,很多想法.猛一看,觉得有那么点儿意思,但仔细看也就那样. 使用webpack这个构建工具,可以使我们少考虑 ...
- git apply、git am打补丁.diff 和 .patch【转】
本文转载自:https://www.jianshu.com/p/e5d801b936b6 前提: 生成patch: git format-patch -M master 生成指定patch,0163b ...