这道题思路方面就不多讲了,主要是通过这题学一下lct维护子树信息. lct某节点u的子树信息由其重链的一棵splay上信息和若干轻儿子子树信息合并而成. splay是有子树结构的,可以在rotate,access的时候由儿子update到父亲,而轻儿子的信息update不上来,需要另外记一下. 记sum[x]为我们要求的子树信息,xu[x]为x的轻儿子的子树信息. (即,xu[x]由轻儿子的sum更新,sum[x]由xu[x]和splay子树上的儿子的sum更新. 这样我们就可以完整地用lct维…
题目传送门 http://uoj.ac/problem/207 题解 如果是一棵静态的树,有一个非常容易想到的算法:统计一下目前的每一个条边被几条路径经过,如果 \(x\) 到 \(y\) 的边的这个值为 \(|S|\) 的话,那么就是合法的. 但是如果树是动态的,这个算法就有问题了. link 和 cut 会导致一个点对之间的路径发生改变. 考虑到如果 \(x\) 到 \(y\) 这条边必须要被经过的话,那么就是说覆盖了 \(x\) 到 \(y\) 这条边的路径集恰好是 \(S\). 回顾 b…
UOJ sol 这题真是太神啦! 对于S集合中的每个点对,给他们随机附上一个相同权值. 两个点在边(x,y)的两侧当且仅当一个点在x的子树中,另一个点不在x的子树中(假设x是y的儿子) 维护一下子树点权异或和,若x子树的异或和等于所有点对权值的异或和就说明(x,y)是一条必经边 splay终于使用正常方法写 祭 这种算法是可以卡的吧... code #include<cstdio> #include<algorithm> #include<ctime> using na…
话说我可能还没有调出魔法森林呢...说好的lct第一题呢... 又是一个随机化的方法,毕竟又是判定性的问题 上次是判断无向图联通 这次是判断一些路径是否经过一条定边 若把路径上的边全部异或上一个路径的权值 只要判断这条边的权值是否是所有路径的权值异或和就没了 lct维护链上异或和就好了 #include<bits/stdc++.h> #define MAXN 100010 #define MAXM 300010 #define ll long long using namespace std;…
题目描述 给出一棵树和一个点对集合S,多次改变这棵树的形态.在集合中加入或删除点对,或询问集合内的每组点对之间的路径是否都经过某条给定边. 输入 输入的第一行包含一个整数 id,表示测试数据编号,如第一组数据的id=1,样例数据的 id 可以忽略.输入的第二行包含两个整数 n,m,分别表示图中的点数,以及接下来会发生的事件数,事件的定义下文中会有描述.初始时 S 为空.接下来 n−1 行,每行两个正整数 x,y,表示点 x 和点 y 之间有一条无向边.接下来 m 行,每行描述一个事件,每行的第一…
这个题目的关键就是判断 大爷所有可能会走的路 会不会经过询问的边. 某一条路径经过其中的一条边, 那么2个端点是在这条边的2测的. 现在我们要判断所有的路径是不是都经过 u -> v 我们以u为根节点, 如果所有的路劲的起点 有且仅有一个点在 v 的子树内 我们就可以知道这个边是合法的. 那么我们每次增加路劲之后, 都在2个端点都亦或上某一个值, 每次判断的时候都判断这个v的子树内整颗树的亦或和是不是等于整体亦或和.如果是 那就说明合法. 现在我们用lct维护这个树. 在这个地方我们需要用lct…
#207. 共价大爷游长沙 题意:一棵树,支持加边删边,加入点对,删除点对,询问所有点对是否经过一条边 一开始一直想在边权上做文章,或者从连通分量角度考虑,比较接近正解了,但是没想到给点对分配权值所以没做出来 题解的后两种做法说的很清楚了,我用了第二种因为我没写过lct维护子树信息 给点对分配权值后,我们只要看一条边的权值是否等于当前异或和就行了 加边删边时,把删除边\((u,v)\)的权值异或到之后\((u,v)\)的路径上,巧妙利用了异或的自反性,和wc那道xor很像 #include <i…
[UOJ207]共价大爷游长沙(Link-Cut Tree,随机化) 题面 UOJ 题解 这题太神了 \(\%\%\%myy\) 看到动态的维护边很容易的想到了\(LCT\) 然后能否堵住一条路 我们也不难想到,以这条路的一个端点为根的子数 是否恰好包含了集合中所有点对的中的恰好一个点 但是怎么算恰好包括了一个点... 不会呀... \(\%\%\%myy\)神奇的随机算法 对于每个点对, 就给这两个点随便随机一个点权 维护子树异或和 这样就可以检查子树异或和是否恰好和所有权值的异或和相等 把随…
有些题目,在要求支持link-cut之外,还会在线询问某个子树的信息.LCT可以通过维护虚边信息完成这个操作. 对于LCT上每个节点,维护两个两sz和si,后者维护该点所有虚儿子的信息,前者维护该点的所有信息和. 那么显然有:$si[x]=\sum sz[pson]$,$sz[x]=sz[lson]+sz[rson]+si[x]+v[x]$. 其中pson是虚儿子,lson,rson是LCT上的实儿子,v是节点本身的信息. 那么,考虑在哪些操作下需要更新这两个值. 1.access  每次将旧虚…
「UOJ207」共价大爷游长沙 解题思路 : 快速判断两个集合是否完全相等可以随机点权 \(\text{xor}\) 的思路可以用到这道题上面,给每一条路径随机一个点权,维护出经过每一条边的点权的 \(\text{xor}\) 值判断是否和全集相等即可. 因为要支持删边加边操作,可以用一棵 \(\text{lct}\) 来维护.对于删边,相当于是原来经过这条边的路径要改为从新的树上的那条路径经过,那只要将原有的 \(\text{xor}\) 值修改过去即可. /*program by mango…