P1586
题意:DAG,求从s到t所有不同的路径的长度和
SOL:考虑DP,t[x]t[x]t[x]表示点x会被经过多少次,对于边(u,v,w)(u,v,w)(u,v,w),贡献为w∗t[x]w*t[x]w∗t[x],f[x]f[x]f[x]表示到x的长度和,f[v]+=f[u]+w∗t[u]f[v]+=f[u]+w*t[u]f[v]+=f[u]+w∗t[u],拓扑排序转移即可
P1983
题意:给定若干个1-n的子序列,每个子序列首尾之间未被选中的点的等级比被选中的点等级低,求整个序列最高等级的点的等级最小是多少
SOL:原题复杂度随便过,考虑更大的复杂度。
暴力做法:单独考虑每个子序列,未被选中的点向所有被选中的点连边表示一个小于关系,全连完边之后做拓扑排序。边数是n3n^3n3级别,n个序列,每个序列可以连n2n^2n2条边
优化1:设虚点,未被选中的点→虚点→被选中的点,每个序列优化到O(n)O(n)O(n)条边
优化2:线段树优化建图,考虑未被选中的点会被被选中的点分成一个一个区间,将未被选中的区间用线段树优化,进一步优化未选中的点→虚点这一层的边数至O(logn)O(logn)O(logn)