题意
给定同余方程组,要求支持如下操作
- 输出
- 修改一个方程
做法
从四月开始学LCT就想做的题目,现在总算A掉了十分欣慰。中秋节假期完成了一项遗愿。。
每个方程看做一个节点i,将i与p_i连边即可形成一个基环森林
基环树的形态是一个链在端点上连着一个环
由于要支持修改操作,即在树上换爹的操作,所以要用LCT
因为要用LCT,所以要拆环,每个点记录virtual father表示拆环之前的father,这样,每棵基环树上有一个vfa不为null的节点,自然该点为root,将vfa称为断点。
现在要维护信息。可以发现环上的每个点转一圈都可以得到与自己的形如的线性关系。只要找出一个点的这个方程,解出来,那基环树上所有的点就都搞定了。
这样,因为断点一定在环上,而且貌似比较特殊,所以就想办法维护断点的方程。
1
2Access(vfa);
Splay(vfa);
这样,从vfa向上,一直到root的点就都在左子树。的时候就把左子树的方程带入自己得到,再把左子树带入自己的方程带入右子树的方程就行了。
TIPS
- 同一时刻,每个节点维护的信息不需要都有什么意义,因为获得信息的时候要。需要考虑的只是怎么样动态的得到根节点的信息,让根节点的信息有意义即可。
- 基环树形态的特殊性使其可以用树上的结构处理。
CODE
1 |
|