【考后总结】12 月北京省选模拟赛 1
12.11 省选联测 1
\(\text{ynycoding round}\)
T1 interval
考虑一个反悔贪心,先将所有区间排序。
从左到右枚举每个区间,维护一个堆表示之前枚举到但是没有匹配的区间,从中任选一个合法的作为左区间,当前枚举的作为右区间。考虑反悔,发现反悔的意义在于已经匹配过的区间可能作为实际最优匹配的左区间,原因是右端点会更小。此时所有的匹配都一定能将右区间换成当前枚举的区间,于是再用一个堆维护当前的匹配即可,每次取右区间右端点最小的即可。
T2 apers
\(k=1\) 的情况就是最小割。将每个节点拆成边用容量来代表代价,同时分出 \(k\) 层,记 \((u,i,0/1)\) 为 \(u\) 节点在第 \(i\) 层中拆出的前一个/后一个节点。
那么首先是 \((u,i,0)\rightarrow (u,i,1)\) 且容量为 \(c_u\),对应割边。之后为了让割存在,刻画一条边 \((u,v)\) 时应当连 \((u,i,1)\rightarrow (v,i,0)\) 且容量为 \(\infty\)。最后要限制每一层都割,那么连 \((u,i,0)\rightarrow (u,i+1,1)\),这样可以进入下一层,保证每一层都要有割。
T3 circles
按 \(a_i\) 升序排序。
最后的环一定是左右部点交替相连的,考虑已经加入了 \([1,a_i]\) 的右部点,此时再加入左部点 \(i\),就可以和任意一个右部点相连,可以合并两个链,也可以将一个链首尾相连得到环。所以 DP 是关于链数对应方案数的,先加入右部点,贡献是加入孤立点,之后加入 \(a_i\) 恰好为当前加入右部点个数的左部点,贡献是合并。
注意这样每个环只会在最大左部点位置断开计算,但是两个方向都会计算一次。还要减去所谓二元环的贡献。
12.15 省选联测 2
\(\text{command_block round}\)
T1 染色
发现染色的结果是一样的,所以实际的顺序并不重要。
对于一个最终状态,合法的充要条件是每个有色连续段中,至少存在一个长度为 \(k\) 的纯色段。由于对长度为 \(n\) 的序列操作 \(n\) 次,所以无论什么情况都能构造出来,也就不用考虑操作次数,那么把长度 \(\le k\) 的无色段也看作纯色段,DP 就是对当前有色连续段是否已经有长度为 \(k\) 的纯色段讨论,算方案数,记作 \(f_{i,0/1}\)。
转移是形如:
改写就是:
记 \(g_{i,0/1}\) 为 \(f_{i,0/1}\) 的前缀和,就还能写成:
这样可以矩阵乘法优化了。
算答案时为了方便,不考虑左右两侧的长度 \(>k\) 的无色连续段,所以答案是:
整理成 \(g\) 就是:
所以矩阵还要加入 \(g_{i,1}\) 前缀和这一维。
预处理转移矩阵,每次询问用倍增,时间复杂度 \(O(k^3\log n+Tk^2\log n)\)。
T2 货车运输
感觉比 T1 要简单。
考虑根据已知信息建出 Kruskal 重构树,对每条边 \(i\) 统计使得存在 \(x\) 满足 \(d(u,x)=i\) 的 \(u\) 个数,那么每次取当前集合中个数最大值就是子树的根,这部分时间复杂度 \(O(n^2\log n)\)。
考虑在重构树上 DP,实际就是把权值序列合并,认为越靠前的优先级越高。此时要求当前节点的树边在左右子树的树边之后,且跨过左右子树的非树边在当前节点的树边之后。
设 \(f_{u,i}\) 表示 \(u\) 子树内所有边的权值序列中,最后一条树边的优先级为 \(i\) 的方案数。转移可以先把左右子树的权值序列合并,假设左子树的树边作为合并后序列的最后一条树边,设 \(g_i\) 为合并后序列最后一条树边优先级为 \(i\) 的方案数,设 \(u\) 子树内总边数 \(siz_u\),转移形如:
考虑再把跨过左右子树的所有边都合并进去,枚举树边的位置,非树边也是合并,设跨过 \(u\) 子树的非树边有 \(cnt_u\) 条,转移形如:
时间复杂度 \(O(n^2\log n+m^2)\)。
T3 稀疏边集
改不了一点。