0729 题解
T1 二分图匹配(match)
30p
LCS模板
额外20p
设 \(S_1\) 中字符为 c,答案为 \(S_2\) 中 \(c\) 的个数 与 \(n\) 的最小值
100p
首先考虑最传统的做法,可以发现答案只有\(m\)
所以可以令 \(f[i][j]\) 表示答案为\(i\),\(S_1\) 串匹配到 \(j\) 的 \(S_2\) 串匹配最小位置
用nxt数组表示下一个位置
\(f[i][j]=min(f[i][j-1],nxt[f[i-1][j-1]][S_1[j]])\)
T2 虚图(map)
30p
暴力对每个关键点dijkstra
额外20p
用树形DP求出关键点的最近距离
100p
首先显然求出所有的被标记的点出发的最短路
显然每个被标记的点都有自己的管辖范围(在管辖范围中的点距离该点最近)
假设最后答案是 \((u,v)\) ,则显然对于 \((u,v)\) 最短路径上的点,都被 \(u\) 或 \(v\) 管辖(否则可以找到另外一对答案更小的点),且存在一个分界点使得分界点左边的点都归 \(u\) 管,右边的点都归 \(v\) 管,所以枚举分界边即可
T3 任务安排
20p
枚举后数位分离,模拟冒泡排序即可
30p
容易发现冒泡排序交换次数为逆序对数,所以用 \(O(nlgn)\) 求逆序对的算法
60分
显然数位DP,\([L,R]=[1,R]-[1,L-1]\)
对于区间 \([1,R]\),将 \(R\) 分解的结果记作 \(a[1],a[2],\cdots,a[n]\)
从前往后枚举数位。
枚举第 \(i\) 位的数,如果第 \(i\) 位 \(j<a[i]\) ,则后面部分每位都可以在\(0\sim 9\)中随意选,答案可以分为两部分:后面的逆序对数 \(f[i][j]\) 和前面与后面的组合的贡献
如果第 \(i\) 位 \(j=a[i]\) ,考虑 \(a[i]\) 和前面的 \(a[k],k\in [1,i-1]\cap Z\) 组成的数对的总贡献
记 \(g[i]\) 为后 \(i\) 位的序列数量,可以用dfs处理
记 $ f[i][j]$ 表示前 \(i\) 位,第 \(i\) 位是 \(j\) 的你逆序对数,可以直接dp
时间复杂度为\(O(10 lgR)\)
100p
容易发现每次\(f\) 数组保持不变,可以提前预处理出来
最后时间复杂度为 \(O(TnlgR)\)
T4 亲戚(rel)
20p
通过枚举prufer序列或者其余方式枚举所有树,时间复杂度为\(O(n^n)\)
额外10p
容易发现:若一个限制只包含一个点,则此限制不产生影响
全为YES
50p
\(A_i\) 表示包含 i 的限制构成的集合,若一个限制只包含一个点,则此限制不产生影响,不计入 \(A_i\)
考虑一棵树的叶子 v 与其父亲 u,可知 Av⊆Au。因此可以想到一种构造方法:每次从未删去的点中选出 v与 u 使 Av⊆Au,将 v 作为 u 的儿子,每次找出后将 \(v\) 删除,会导致一些原本包含 v 的限制变得只包含一个点,为保证流程正常进行须删去此限制对 A 的影响。
暴力模拟上述过程,可以模拟输出 YES
,反之为 NO
总共枚举 \(n\) 轮,每次枚举两个点,判断子集时间复杂度为\(O(m)\)
时间复杂度为 \(O(n^3m)\)
70分
法一、用bitset优化A数组,时间复杂度为 \(O(\frac{n^3m}{w })\)
法二、会导致一些原本包含 v 的限制变得只包含一个点,为保证流程正常进行须删去此限制对 A 的影响,这个过程中发现此时该限制中的点一定为 \(u\),故而只会修改 \(A_u\),每次处理 \(A_u\) 的子集关系即可,时间复杂度为\(O(n^2m)\)
100p
同时使用两个优化,时间复杂度为 \(O(\frac{n^2m}{w })\)
暴力得分100+50+30+30=210