首页 > 其他分享 >test20230908

test20230908

时间:2023-09-08 17:34:44浏览次数:33  
标签:二进制 复杂度 路径 oplus 我们 test20230908 节点

写在前面的话

今天考试挂麻了,考场估分 \(100+100+60+50=310\) ,考后得分 \(100+70+60+0=230\) 。十分抽象的分数。还是有 \(\text{rank2}\) ,之后需要更加细心才行。

T1

题目描述

现在给出 \(x\& y\) 和 \(x \oplus y\) ,希望求出 \(x|y\) 。题目保证存在合法的 \(x,y\) 。

思路点拨

\(\text{ZROI}\) 22年的题目咋天天T1送分?我们对于二进制上的每一位分类讨论。

  • 二进制上 \(x\&y\) 和 \(x \oplus y\) 均为 \(1\) 。不可能,不满足运算的定义。

  • 二进制上 \(x \& y\) 为 \(0\) ,\(x \oplus y\) 为 \(1\) 。这时就是 \(x,y\) 在该二进制为上有一个为 \(1\) ,此时 \(x|y\) 也为 \(1\) 。

  • 二进制上 \(x \& y\) 为 \(1\) ,\(x \oplus y\) 为 \(0\) 。这时就是 \(x,y\) 在该二进制为上都为 \(1\) ,此时 \(x|y\) 也为 \(1\)。

  • 二进制上 \(x \& y\) 和 \(x \oplus y\) 都为 \(0\) 。这个时候 \(x,y\) 在该二进制上都为 \(0\) ,\(x|y\) 也为 \(0\) 。

总结一下规律,当 \(x\&y + x\oplus y\) 其实就等价于 \((x\& y)|(x\oplus y)\) ,又因为第一种情况不会存在,这还等价于 \((x \& y)+(x\oplus y)\) 。

T2

题目描述

现在有两个团,团之间有一些边连接这他们。希望求出最大团以及他的节点包含哪些。
$n \leqslant 500 $ 。

思路点拨

如果只有两个团的话,这张图的补图就是一张二分图。节点 \(x,y\) 之间的连边就诠释了 \(x,y\) 不可以存在于同一个团中。

并且一个团的节点在这张二分图中一定会满足两两之间没有连边,这是一个充要条件:

充分:如果一个团在补图的二分图中存在两个节点有连边,那么在原图中这两个节点就没有连边。这显然与我们团的假设相违背。

必要:如果补图的二分图中存在一些点两两之间没有边,那么在原图之中他们两两之间都有连边,这满足团的定义。

知道了这个性质之后我们希望在一张二分图中求出尽可能多的节点使得两两之间没有连边显然就是图的最大独立集问题,NP问题。但是由于二分图的优秀性质,我们可以用 \(n-\) 最大匹配得到并构造一个方案。

时间复杂度 \(O(n^3)\) ,瓶颈在于求出最大匹配。可以由于求最大匹配可以网络流建模,边权都是单位流量,所以时间复杂度可以优化至 \(O(n^2 \sqrt n)\) 。

T3

因为正解严重超纲,所以这里暂时讨论最高部分分—— \(60\) 分的动态规划做法。

题目描述

现在有一个 \(n\) 个节点的无根树,边有边权。我们需要选出 \(k\) 个点 \(p_1,p_2,...,p_k\) ,使得 \(\sum_{i=1}^k dis(p_i,p_{(i \bmod k)+1})\) 尽可能大。\(dis(x,y)\) 表示节点 \(x,y\) 在树上的最短路径长度。

思路点拨

对于一些节点,顺序怎么安排是最好的?这个问题很难讨论,如果陷进去这个题目不可能做出来,我们意识到这一点,去讨论一条边对于一种方案产生的贡献是什么。

现在存在一条边连接 \(u,v\) ,边权为 \(w\) 。假设 \(u\) 节点是深度大的那个节点,他的子树内选择了 \(x\) 个节点。对于一个子树内的节点,我们尽可能走到子树外的节点,那么一个节点一定会被一个节点走到它,然后从它走出去(其中肯定是包含 \(p_1\) ,因为 \(p_1\) 到 \(p_2\) ,\(p_k\) 到 \(p_1\))。对于这个边 \((u,v)\) 被进过的最多次数就是 \(\min\{k-x,x\}\times val \times 2\) 。对于每一个子树我们都可以这么讨论,由此得到最佳的贡献计算方式。

看到这种答案的计算方式需要分配每一个子树内被选择的贡献,果断想到树形动态规划,我们定义状态 \(f_{i,j}\) 表示考虑到子树 \(i\) ,子树内选择了 \(j\) 个节点的最大贡献。转移比较显然(本题主要难在计算边的贡献的讨论过程):

\[f_{i,j}=\max\{f_{i,v}+f_{son,j-v}+2val\times \min\{v,k-v\}\} \]

时间复杂度 $O(nk) $ 。

T4

题目描述

现在有一个 \(n\) 个点 \(m\) 条边的有向图。每一条边 \((u,v)\) 都满足 \(u<v\) 。现在又有 \(k\) 条有向图上的特殊路径,你需要求出 \(1\) 到 \(i\) 节点部进过特殊路径的路径数量。对于进过,就是路径完全包含了特殊路径的意思。

思路点拨

本题是一道绝世好题,除了巧妙的正解之外,状态压缩动态规划的做法也是值得我们讨论的。

状态压缩动态规划做法

时间复杂度为 \(O(2^k n)\) 的做法。

我们定义状态 \(dp[i][j]\) 表示目前在节点 \(i\) ,\(j\) 是一个二进制数,如果第 \(i\) 位为 \(1\) 就表示目前在 \(i\) 路径的途中(也就是没有完全包含)。转移顺序可以使用拓扑排序,但是因为边从节点小走向节点大,所以可以直接按照下标转移。

转移十分简单,我们记录 \(ft_i\) 表示 \(i\) 作为那些路径的起点。这是一个二进制数,如果第 \(i\) 位为 \(1\) 就表示这个节点作为节点 \(i\) 的起点。\(ed_i\) 表示 \(i\) 作为哪些路径的终点,形式同 \(ft_i\) 。每一次转移的时候,我们从 \(dp[u][j]\) 转移到节点 \(v\) 的时候,对于状态 \(j\) 先求出路径脱离了哪些特殊路径,去除其在 \(j\) 中的影响。之后将 \(j|ft_v=sta\) 求出新状态。至于为什么要或 \(ft_v\) 的原因就是现在这个路径又步入了 \(ft_v\) 这些路径的范畴中。

这样转移不一定是对的,如果 \(j\& ed_v \neq 0\) ,就表示这时我们已经包含了一条特殊路径,是不可以转移的。对于节点 \(i\) 的答案就是 \(\sum_{j}dp_{i,j}\) 。每一个状态都是合法的,没有包含任何特殊路径。

基于主席树优化的std做法

首先,我们将边取反之后转而求节点 \(i\) 到 \(1\) 的答案,方案可以先记为全部出边的答案和,可是我们没有考虑包含了特殊路径的情况。

一种比较的想法就是直接减去特殊路径终点的答案,这样显然不对,连后效性都没有。遇到特殊路径包含的情况更是直接GG 。这让我们意识到,如果想要正确的求出答案,一定要有后效性,进而想到我们可以尝试着改变图的形态。我们可以这么操作:假设一条路径为 \(i_1,i_2,i_3,...,i_k\) ,我们对于每一个点复制为 \(j_1,j_2,j_3,...,j_k\) 。每一个节点的出边采用继承机制,但是 \(j_pos\) 到 \(i_{pos+1}\) 的路径变为 \(j_{pos}\) 到 \(j_{pos+1}\) 。\(j_{k-1}\) 到 \(i_k\) 的出边我们直接不要了。通过这种方式我们就删除了这条路径。可是做法依赖于出度,出度一大就会 TLE + MLE 。

但是节点复制就是可持久化嘛,每一次复制就是主席树上的操作。我们干脆对于每一条边都建立一条主席树。加边啊,删除啊,都是单点修改。

时间复杂度 \(O(n \log n)\) 。

标签:二进制,复杂度,路径,oplus,我们,test20230908,节点
From: https://www.cnblogs.com/Diavolo/p/17688143.html

相关文章