Loading

模拟赛8.15 解题报告

T1. 这一切

题意:一张无向图,初始时每条边有黑/白两种颜色。每一秒,若存在点 \(u\),满足与 \(u\) 相连的边中,只有一条边是白色,那么这条边就会自动变成黑色。若过了 \(10^{10^{10^{10^{...}}}}\) 秒后,所有边都变成了黑色,问初始时黑色边的数量最小是多少。\(1\le n,m\le10^6\)

把黑边看做消失,定义点的度数为相连的白边数量,度数为 \(1\) 的点可以看做不断删点。那么,把度数为 \(d\) 的点删除的代价为 \(d-1\),删除该点后,与该点相邻的点的度数都会减一。感性理解,我们的删点代价有两倍贡献,而一个连通块中所有点的度数恰好为边数之和的两倍。删点的代价并不是 \(d\) 而是 \(d-1\),那么删除大小为 \(l\)、遍数为 \(e\) 的连通块的所有点,\(-1\) 的贡献之和为 \(-l\),而 \(d\) 的贡献之和为 \(2e\),但因为每次删边有两倍贡献,我们贡献次数是实际的 \(\frac 12\),因此总贡献为 \(e\)。但因为删到最后一个点时,度数为 \(0\),此时该点没有 \(-1\) 的贡献,因此一个连通块的贡献为 \(e-n+1\)

然后把所有连通块的贡献加起来即可,时间复杂度 \(O(n\alpha(n))\)

T2. 都是(『JOISC2014』有趣的家庭菜园)

题意:\(n\) 个数 \(a_{1...n}\),每次交换相邻两个数,求使得存在一个 \(k\),满足 \(a_1\le a_2\le...\le a_{k-1}\le a_k\ge a_{k+1}\ge...\ge a_{n-1}\ge a_n\) 的最小交换次数。

原题过于 \(\text{ATC}\),很符合我对 \(\text{JAPAN}\) 的想象。

想题过程太痛苦了,这题把我送走了(

直接思考两边的数的移动过于困难,考虑最小值,他一定是在交换后序列的两端中的一端。

显然,最小值需要和其他数都贡献一次,我们只需要比较左边和右边哪边数字少即可。

然后剩下就是个子问题(无后效性)。我们不能暴力将最小值移到两端,可以把这个位置标记为删除,记录每个位置是否存在,若存在则标记为 \(1\),否则为 \(0\),然后用树状数组就能做到 \(O(n\log n)\)

T3. 命运石之门的

有三种动物,标为 \(0,1,2\),其中 \(1\)\(0\) 的天敌,\(2\)\(1\) 的天敌,\(0\)\(1\) 的天敌。一开始有 \(n\) 个动物,第 \(i\) 个动物关在第 \(i\) 个笼子里,有 \(m\) 次操作,每次操作二选一:

  • \(1\space u\space v\):把第 \(v\) 个笼子里的动物放到第 \(u\) 个笼子里去,摧毁第 \(v\) 个笼子,然后两只动物进行决斗,天敌胜利。若种类相同则原来在第 \(u\) 个笼子里的动物胜利。

  • \(2\space u\):若第 \(u\) 个动物现在仍然存活,那么初始时一共有多少种动物种类状态。(动物种类状态:\(n\) 个笼子里的动物种类构成一个状态)

\(1\le n,m\le2\times10^5\)

一眼套路,考虑离线建树。

一次对 \(u,v\) 的合并,开一个新的点 \(p\),连边 \(p\rightarrow u,\space p\rightarrow v\),然后用一个并查集维护一个点当前所在树的根,比如此时另 \(d_u=d_v=p\)

对于每个询问,我们转化成“点 \(u\) 不断向上跳父亲,直到一个指定的点 \(f\),与 \(f\) 子树内其他点合并仍存在的初始局面方案数”,称为询问 \((u,f)\)

对于每个询问 \((u,f)\),我们暴力跳父亲,当跳到点 \(p\) 时,我们把 \(u\)\(p\) 的另一个儿子的子树合并。设 \(g[u,0/1/2]\) 表示 \(u\) 子树内最终存活的动物种类为 \(0/1/2\) 时,\(u\) 子树内的叶子的初始局面方案数。然后发现 \(g[u,0/1/2]=3^{|\text{subtree}(u)|-1}\),利用这个我们就能快速合并。

但是暴力跳父亲最多跳 \(O(n)\) 次,时间复杂度为 \(O(nq)\)。考虑一遍 \(\text{DFS}\),当前遍历到了 \(u\),计算 \(u\) 的左右儿子子树互相的贡献,用一个线段树+\text{DFS}序即可解决。

时间复杂度 \(O(n\log n+q)\)

T4. 选择

题意:\(n\) 个点一棵树,\(m\) 次询问,每次给出 \(u,v,k(u\not=v)\),求有多少种选择 \(k\) 条路径的方案,满足路径两两之间的交集为 \(\text{Path}(u,v)\)\(1\le n,m\le10^5,\space 2\le k\le500\)

路径两两之间不相交,那么对于 \(u\),不存在两条路径覆盖 \(u\) 的同一个非 \(v\) 方向的儿子;\(v\) 同理。

因此,每条路径向点 \(u,v\) 之外延伸,两边延伸的子路径独立,可以分开考虑。

\(f[u,i]\) 表示点 \(u\) 向外拓展 \(i\) 条两两不相交的路径有多少种方案,这个东西可以预处理,每条边会被转移 \(2\) 次,时间复杂度 \(O(nk)\)

放到询问上,我们需要容斥去掉 \(u\)\(v\) 方向拓展的路径,反向背包即可。

时间复杂度 \(O(qk+n(\log n+k))\)

posted @ 2023-08-15 16:33  Lgx_Q  阅读(7)  评论(0编辑  收藏  举报