摘要:"原题链接" 每个点开一个权值线段树,然后用树上差分的方法修改,最后自底向上暴力线段树合并即可。 不过空间较大,会$MLE$,写个内存池就可以了。 cpp include include using namespace std; const int N = 1e5 + 10; const int M
阅读全文
摘要:"原题链接" 假设只有一个政党,那么这题就退化成求树的直径的问题了,所以我们可以从此联想至$k$个政党的情况。 先处理出每个政党的最大深度,然后枚举每个政党的其它点,通过$LCA$计算长度取$\max$即可。 因为枚举只是枚举该政党的所有点,所以总的枚举复杂度依旧是$O(n)$,总复杂度$O(nlo
阅读全文
摘要:"原题链接" 很水的一道题,先用$tarjan$找边双连通分量并缩点,因为缩点后必然是一棵树,所以直接$LCA$求距离即可。 另外因为有重边(说好的只有单键呢),所以需要判重,一开始我用的$HASH$判重,结果又被卡了。。。 ~~和$HASH$天理难容,每次用都被卡~~ 最后一气之下$bitset$
阅读全文
摘要:"原题链接" 要解决这题有一个很重要的思想,就是将跑步的路径拆开来,分成向上走的$S\to LCA(S,T)$,及向下走的$LCA(S,T)\to T$($S$是路径起点,$T$是路径终点)。 然后对于两种路径单独统计贡献。 先只考虑向上走的路径$S\to LCA(S,T)$。 对于一个观测点$i$
阅读全文
摘要:"BZOJ原题链接" "洛谷原题链接" 用$LCA$初始化出所有运输计划的原始时间,因为答案有单调性,所以二分答案,然后考虑检验答案。 很容易想到将所有超出当前二分的答案的运输计划所经过的路径标记,在这些运输计划都经过的边中的权值最大的这条边上建立虫洞,如果能使得所有运输计划中需要时间最多的那个计划
阅读全文
摘要:"原题链接" 先用$tarjan$找出所有$e DCC$,并进行缩点,这时桥的数量即是缩点后树的边数。 然后对于每一个添边$(x,y)$的操作,如果$x,y$属于同一个$e DCC$,那么桥的数量不变。 如果分别属于两个$e DCC$,那么从$x$所在的$e DCC$(设为$e[x]$)到$y$所在
阅读全文
摘要:一道贪心+LCA倍增法的预处理+二分答案 "原题链接" 又是一道细节贼多的题。。敲了我一个晚上。。 显然可以二分答案,然后就是判定的问题。 贪心地发现军队越在靠近首都的点建立检查站,则贡献越大。所以我们让所有军队都往首都靠近,这时所有军队要么无法到达首都的子节点,要么已经到达首都的子节点,而对于前者
阅读全文
摘要:一道LCA+生成树 "BZOJ原题链接" "洛谷原题链接" 细节挺多,我调了半天。。累炸。。 回到正题,我们先求出随便一棵最小生成树(设边权和为$s$),然后扫描剩下所有边,设扫到的边的两端点为$x,y$,长度为$z$,树上$x,y$间边权最大的边和严格次大的边分别为$dis_1,dis_2$。 如
阅读全文
摘要:一道LCA "原题链接" 先跑一边$dfs$,求出每个节点的时间戳,如果我们将有异象石的节点按时间戳从小到大的顺序排列,累加相邻两节点之间的距离(首尾相邻),会发现总和就是答案的两倍。 于是我们只需要维护这个按时间戳排序的有序数列和答案即可。 当插入一个新的节点$u$时,设插入位置的原有两节点为$x
阅读全文
摘要:一道LCA+树上差分 "原题链接" 显然每一条新增边都会导致环。 如果试着举些例子的话,很容易发现割掉非环上的边,则割掉其他任意一条新增边都可达成目标;若割掉的原有边是一个环上的边,那么只有割掉导致这个环出现的新增边才能使得图变为不连通的两部分。若割掉的边是两个或两个以上的环上的边,那么无论第二次怎
阅读全文
摘要:一道LCA模板 "原题链接" $LCA$模板题,不解释。 倍增版 cpp include include include using namespace std; const int N = 4e4 + 10; int fi[N], da[N '9'; c = getchar()) p |= c =
阅读全文