闲话8.5
今天上午上课,发现多了两道黑题😨,所以学了一上午离线算法😋。中午和老姐出去吃饭,sjz的麻辣烫确实还不错😋😋😋。
可恶的_龙朵耳今天竟然做了出生的事情😨😨😨,把恋恋的帽子摘下来放到屁股下面😨😨😨,建议依照《fumo保护法》直接就地枪决😡😤,真的是太出生了。
今天搞到了haosen学长的讲课视频,haosen的声音好色嘿嘿……haosen😍。听说初中那边都离线了,绝对是haosen学长讲得太好了😤😤😤。
下午和晚上被9道黑题和一道暂未评定暴打了。
今天的题目↑
CF1299D
先想最大 XOR 路径中的套路:把所有的环找出来,这些就是能拿的异或值。我们先考虑一个及其暴力的dp:设 \(f_{i, j}\) 为考虑前 \(i\) 个连通块时,且能表示出来 \(j\) 这个状态的数的可行性(\(j=2^{32}\))。转移时就看下一个连通块能表示出来什么然后转移即可。
状态数太多,考虑优化。我们发现异或能表示出来什么数这种东西很像线性基,我们考虑大小为 \(5\) 的本质不同的线性基一共有多少。通过打表可以发现:一共有 \(374\) 种。非常少,我们就可以把它们放到第二维。我们再处理出一个 \(ok\) 数组,表示当前连通块是否能凑出来 \(0\) 这个数。当 \(ok_i=0\) 时,这个连通块直接跳过即可。
同时我们可以预处理出来所有的转移,这样不用每次转移时都做一次 \(O(\log^2 w)\) 的线性基合并了。
我们再考虑 \(1\) 在环中的情况。由于题目中说了只会包含在三元环中,因此一个连通块最多只会和 \(1\) 有两条边,我们考虑是否两条边都走,或者就走一条边,或者全部删掉。不同之处只有两条边都走这个选择,我们这时会加上三元环的贡献,我们加上即可。因此这种情况的转移方程为:
时间复杂度不会算,反正能过。