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

posted @ 2025-07-29 14:14  Aapwp  阅读(26)  评论(0)    收藏  举报
我给你一个没有信仰的人的忠诚