BZOJ 2744 [HEOI2012] 朋友圈

发布于 2017-05-27  232 次阅读


题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2744

题意:

对于 A,B 两个点集,每个点均有一个权值。对于点集 A 中的两个互异元素,记它们的权值为 (i,j),当且仅当 (i^j)%2=1 时它们间有边相连。
对于点集 B 中的两个互异元素,记它们的权值为 (i,j),若 (i^j)%2=0 或 (i|j) 在二进制下有奇数个 1 时它们间有边相连,此处^记为异或,|记为或,给出 A,B 集间的连接关系,求整个图的最大团...


很神的一道好题....

首先如果是一般图的最大团问题.... 这个数据范围肯定是不可做的啦.... 所以我们考虑下这个图有什么特殊的性质.... 让我们先用人话重述一遍题意...

对于 A 集,仅在奇数和偶数间有边相连,对于 B 集,奇数和奇数间,偶数和偶数间,还有一个特殊情况间有边相连...

很明显,A 集是个二分图,它的性质比较优越... 考虑一下可知,A 集的最大团仅能为 0,1,2... 最大为 2.... 因为如果在一奇一偶以外再引入一个点必然与其中一个点没有边相连....

B 集的最大团不是很好搞... 我们取它的补图,即当且仅当奇偶不同且满足 (i|j) 在二进制下有偶数个 1 时有边相连,这样 B 图就也是个二分图啦

对于二分图,有一个性质, 它的最大点独立集就是它补图的最大团 ... 那么求最大点独立集即可, 二分图最大点独立集=sum-二分图最大匹配

因为 A 集只可能为答案做出 0,1,2 个点的贡献,我们分别讨论,枚举即可,每次我们只跑和在 A 集中选取的点有边相连的点...

然后如果我们各种 memset,暴力重构图的话是会 TLE 的... 所以我们要优化一下...

在下面给出的程序中,我们以 tag[] 数组记录当前点集 B 中的某点是否可以跑,vis[] 数组记录某次跑最大匹配时是否访问过某点,tim[] 数组记录在当前的匹配下 lk 数组是否被更新过

时间戳优化即可....T1 记录匹配次数,T2 记录 find 次数

有一个需要吐槽的地方... 不小心把"tim[to]!=T1"这里的 T1 全部处理成 T2,居然比正解跑的快 5 倍以上而且能过,事实上这里如果是 T2 是始终为真的... 那么... 貌似数据有点水?对于每个匹配只连第一个即可?这样貌似可以 O(1) 刷 rank 了吗... 算了,懒得刷了 qwq

(大概是正确的) 代码如下:

 


一个非常弱的准退役OIER