LCT
yzyyylx
这个作者很懒,什么都没留下…
展开
-
UOJ #3. 【NOI2014】魔法森林
题面题意给出一张无向图,每条边有a,b两个权值,问从1到n的所有路中,经过的边的a最大值与b的最大值之和的最小值是多少做法总体思路是枚举a,b中的一个值,然后对边按其中一维进行排序,然后一边加边,一边求出此时的最短路来更新答案.法一:SPFA(非正解)每次加边后用SPFA算一次最短路,这样虽然可以过原题的所有数据,但是复杂度不正确,无法过UOJ上的hack数据,因而不推荐.代码#include<io原创 2018-04-11 16:44:02 · 371 阅读 · 1 评论 -
LCT
作用一种动态树,用于维护森林,支持加边,删边,换根等操作,每次操作的复杂度均为log.做法将每棵树分成多条实链,实链之间用虚边连接,要求每一条实链不存在深度相同的点,之后每一条实链再用splay维护,并且维护时保证每个splay维护的子树的中序遍历深度递增,这样就可以动态地修改虚边和实边了.核心操作:access将某个点到根的路径变为实边,可以发现到根的路径将会经过多个splay,每次要将两个spl原创 2018-04-10 16:15:43 · 514 阅读 · 1 评论 -
CodeChef - GERALD07 Chef and Graph Queries
题面 题意 给出一张无向图,每次询问编号L到R的边,问这些边连上之后一共有几个联通块。 做法 听说可以用分块加可持久并查集来做,可惜我不会。 我用的是LCT加树状数组,离线来做。 求连通块的个数可以考虑转化为求此时图中树边的个数,我们可以将询问按照右端点排序,然后随着询问的右端点的右移,来不断向LCT中加边,此时LCT中的边都是树边,将树边存入树状数组中,每次询问L,R这段区间...原创 2018-07-18 19:15:29 · 921 阅读 · 1 评论 -
codeforces1137F Matches Are Not a Child's Play
题面 题意 给出一棵树,每个点有一个优先级,初始为自己的标号,如果每次删去树上优先级最低的叶子,将得到一个序列,要求维护有三种操作: 1.将一个点的优先级修改为此时所有点的优先级的最大值+1 2.询问某个点在序列中的位置 3.询问两个点中哪一个点先被删去 做法 首先第三种操作只要经过两次二操作即可得到,因此不用管它。 观察一下第一种操作之后对序列的影响,发现第一次操作就相当于把原来最大节点到修改节...原创 2019-03-12 12:05:40 · 512 阅读 · 0 评论