摘要:分析 问题显然可以转化为对于每个节点询问所有这个节点的所有链的链并的大小。 考场上我直接通过树剖打标记+树剖线段树维护以$O(n \log^3 n)$的时间复杂度暴力实现了这个过程。(使用LCT或者全局平衡二叉树可以实现$O(n \log^2 n)$的时间复杂度) 考虑如何快速求出链并的大小,有这样
阅读全文
摘要:分析 GXZlegend orz 构造出一组合法的解并不是难事,但是我们需要输出的是字典序最大的解。 字典序最大有另一种理解方式,就是让越小的数尽量越靠后。 我们从树的根结点出发,从1开始填数,构造出来的一定是一组合法的解。 对于每种相同的数,可以通过线段树上二分逐个确定他们的最优位置,具体细节可以
阅读全文
摘要:分析 在线段树上用$4 \times 4$的矩阵打标记。 代码 cpp include define rin(i,a,b) for(register int i=(a);i=(b); i) define trav(i,a) for(register int i=head[a];i;i=e[i].nx
阅读全文
摘要:分析 非常有趣的一道题。 式子中的绝对值很难处理,但是我们发现: $$\sum_{i=1}^{k}|a_{x,i} a_{y,i}|=\sum_{i=1}^{k}max(a_{x,i} a_{y,i},a_{y,i} a_{x,i})=max\{\sum_{i=1}^{k}c_ia_{x,i} \s
阅读全文
摘要:分析 与 "[BZOJ3779]重组病毒" 唯一的区别是多了一个链上求实链段数的操作。 因为每条实链的颜色必然不相同且一条实链上不会有两个深度相同的点(好像算法的正确性和第二个条件没什么关系,算了算了),画图分析可得,如果用$dis[x]$表示从$x$到根结点路径上的实链段数,则$x$到$y$路径上
阅读全文
摘要:分析 其实其他的题解说的都很清楚了。 一个点出发感染到根结点所花费的时间是路径上虚边的条数+1。 RELEASE相当于$access()$。 RECENTER相当于$makeroot()$。(虽然换根和打通路径的先后顺序不同但仔细想想本质其实是一样的) 所以我们可以通过维护一棵LCT来快速知道哪些结
阅读全文
摘要:动态DP 何为动态DP? 将画风正常的DP加上修改操作。 举个例子? 给你一个长度为$n$的数列,从中选出一些数,要求选出的数互不相邻,最大化选出的数的和。 考虑DP,状态设计为$f[i][1/0]$表示考虑了前$i$个数,第$i$个数选/不选的最大和。 状态转移方程显然为: $$f[i][0]=m
阅读全文