题目传送门 Link Cut Tree 题目背景 动态树 题目描述 给定n个点以及每个点的权值,要你处理接下来的m个操作.操作有4种.操作从0到3编号.点从1到n编号. 0:后接两个整数(x,y),代表询问从x到y的路径上的点的权值的xor和.保证x到y是联通的. 1:后接两个整数(x,y),代表连接x到y,若x到y已经联通则无需连接. 2:后接两个整数(x,y),代表删除边(x,y),不保证边(x,y)存在. 3:后接两个整数(x,y),代表将点x上的权值变成y. 输入输出格式 输入格式: 第…
为了优化体验(其实是强迫症),蒟蒻把总结拆成了两篇,方便不同学习阶段的Dalao们切换. LCT总结--应用篇戳这里 概念.性质简述 首先介绍一下链剖分的概念(感谢laofu的讲课) 链剖分,是指一类对树的边进行轻重划分的操作,这样做的目的是为了减少某些链上的修改.查询等操作的复杂度. 目前总共有三类:重链剖分,实链剖分和并不常见的长链剖分 重链剖分 实际上我们经常讲的树剖,就是重链剖分的常用称呼. 对于每个点,选择最大的子树,将这条连边划分为重边,而连向其他子树的边划分为轻边. 若干重边连接在…
题目大意:维护一个森林,支持边的断,连,修改某个点的权值,求树链所有点点权的异或和 洛谷P3690传送门 搞了一个下午终于明白了LCT的原理 #include <cstdio> #include <algorithm> #include <cstring> #define root d[0].ch[1] #define il inline #define nu 7777 #define inf 500000 #define N 300100 using namespac…
题目描述 给定N个点以及每个点的权值,要你处理接下来的M个操作.操作有4种.操作从0到3编号.点从1到N编号. 0:后接两个整数(x,y),代表询问从x到y的路径上的点的权值的xor和.保证x到y是联通的. 1:后接两个整数(x,y),代表连接x到y,若x到Y已经联通则无需连接. 2:后接两个整数(x,y),代表删除边(x,y),不保证边(x,y)存在. 3:后接两个整数(x,y),代表将点X上的权值变成Y. 输入输出格式 输入格式: 第1行两个整数,分别为N和M,代表点数和操作数. 第2行到第…
题目链接 LCT(良心总结) #include <cstdio> #include <cctype> #include <algorithm> #define gc() getchar() const int N=3e5+5; inline int read() { int now=0;register char c=gc(); for(;!isdigit(c);c=gc()); for(;isdigit(c);now=now*10+c-'0',c=gc()); ret…
题目背景 动态树 题目描述 给定n个点以及每个点的权值,要你处理接下来的m个操作.操作有4种.操作从0到3编号.点从1到n编号. 0:后接两个整数(x,y),代表询问从x到y的路径上的点的权值的xor和.保证x到y是联通的. 1:后接两个整数(x,y),代表连接x到y,若x到y已经联通则无需连接. 2:后接两个整数(x,y),代表删除边(x,y),不保证边(x,y)存在. 3:后接两个整数(x,y),代表将点x上的权值变成y. 输入输出格式 输入格式: 第1行两个整数,分别为n和m,代表点数和操…
Luogu 3690 Link Cut Tree \(LCT\) 模板题.可以参考讲解和这份码风(个人认为)良好的代码. 注意用 \(set\) 来维护实际图中两点是否有直接连边,否则无脑 \(Link/Cut\) 会崩掉. #include<bits/stdc++.h> using namespace std; #define ll long long #define mp make_pair #define pii pair<int,int> inline int read()…
二次联通门 : luogu P3690 [模板]Link Cut Tree 莫名RE第8个点....如果有dalao帮忙查错的话万分感激 #include <cstdio> #include <iostream> #define Max 4000002 void read (int &now) { now = ; bool temp = false; register char word = getchar (); ') { if (word == '-') temp =…
P3690 [模板]Link Cut Tree (动态树) 认父不认子的lct 注意:不 要 把 $fa[x]$和$nrt(x)$ 混 在 一 起 ! #include<cstdio> void swap(int &a,int &b){a^=b^=a^=b;} #define N 300005 ][N],fa[N],rev[N]; #define lc ch[0][x] #define rc ch[1][x] ][fa[x]]==x||ch[][fa[x]]==x;} void…
P3690 [模板]Link Cut Tree (动态树) 题目背景 动态树 题目描述 给定n个点以及每个点的权值,要你处理接下来的m个操作.操作有4种.操作从0到3编号.点从1到n编号. 0:后接两个整数(x,y),代表询问从x到y的路径上的点的权值的xor和.保证x到y是联通的. 1:后接两个整数(x,y),代表连接x到y,若x到y已经联通则无需连接. 2:后接两个整数(x,y),代表删除边(x,y),不保证边(x,y)存在. 3:后接两个整数(x,y),代表将点x上的权值变成y. 输入输出…
[模板]Link Cut Tree 思路: LCT模板: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 300005 int n,m,val[maxn]; ],f[maxn],xr[maxn],q[maxn],rev[maxn]; inline void in(int &now) { ;now=; char Cget=getchar(); ') { ; Cget=getchar(); } ') { now=…
Link Cut Tree 刚开始写了个指针版..调了一天然后放弃了.. 最后还是学了黄学长的板子!! #include <bits/stdc++.h> #define INF 0x3f3f3f3f #define full(a, b) memset(a, b, sizeof a) using namespace std; typedef long long ll; inline int lowbit(int x){ return x & (-x); } inline int read…
题意 给定n个点以及每个点的权值,要你处理接下来的m个操作.操作有4种.操作从0到3编号.点从1到n编号. 0:后接两个整数(x,y),代表询问从x到y的路径上的点的权值的xor和.保证x到y是联通的. 1:后接两个整数(x,y),代表连接x到y,若x到y已经联通则无需连接. 2:后接两个整数(x,y),代表删除边(x,y),不保证边(x,y)存在. 3:后接两个整数(x,y),代表将点x上的权值变成y. 数据范围: \(1 \leq N, M \leq 3 \cdot {10}^5\) 分析…
UPD:更新了写法. [模板]Link Cut Tree 给定n个点以及每个点的权值,要你处理接下来的m个操作.操作有4种.操作从0到3编号.点从1到n编号. 后接两个整数(x,y),代表询问从x到y的路径上的点的权值的xor和.保证x到y是联通的. 后接两个整数(x,y),代表连接x到y,若x到y已经联通则无需连接. 后接两个整数(x,y),代表删除边(x,y),不保证边(x,y)存在. 后接两个整数(x,y),代表将点x上的权值变成y. 数据范围: \(1 \leq N, M \leq 3…
Link-Cut-Tree Tags:数据结构 ##更好阅读体验:https://www.zybuluo.com/xzyxzy/note/1027479 一.概述 \(LCT\),动态树的一种,又可以\(link\)又可以\(cut\) 引用:http://www.cnblogs.com/zhoushuyu/p/8137553.html 二.题目 初步 [x] P2147 [SDOI2008]Cave 洞穴勘测 https://www.luogu.org/problemnew/show/P214…
模板题 原理 类似树链剖分对重儿子/长儿子剖分,Link Cut Tree 也做的是类似的链剖分. 每个节点选出 \(0 / 1\) 个儿子作为实儿子,剩下是虚儿子.对应的边是实边/虚边,虚实时可以进行灵活变换的. 实链:实边连起来的极大链,也可以理解为所有实边构成的若干联通块. Splay 维护每个实链,其中中序遍历对应着从上到下维护的路径: 本质上是维护所有实边,用 Splay 中的后继前驱来维护原树的父子关系. 如何维护虚边的父子呢?即实链之间的关系,认父不认子.设 \((u, v)\)…
从这里开始 动态树问题和Link Cut Tree 一些定义 access操作 换根操作 link和cut操作 时间复杂度证明 Link Cut Tree维护链上信息 Link Cut Tree维护子树信息 小结 动态树问题和Link Cut Tree 动态树问题是一类要求维护一个有根树森林,支持对树的分割, 合并等操作的问题. Link Cut Tree(林可砍树?简称LCT)是解决这一类问题的一种数据结构. 一些无聊的定义 Link Cut Tree维护的是动态森林中每棵树的任意链剖分. P…
一直没有点动态树这个科技树,因为听说只能用Splay,用Treap的话多一个log.有一天脑洞大开,想到也许Treap也能从底向上Split.仔细思考了一下,发现翻转标记不好写,再仔细思考了一下,发现还是可以写的,只需要实时交换答案二元组里的两棵树,最后在吧提出来的访问节点放回去就行了.本着只学一种平衡树的想法,脑洞大开加偏执人格的开始写可持久化Treap版的Link Cut Tree... 写了才发现,常数硕大啊!!!代码超长啊!!!因为merge是从上到下,split从下到上,pushdow…
[BJOI2014]大融合(Link Cut Tree) 题面 给出一棵树,动态加边,动态查询通过每条边的简单路径数量. 分析 通过每条边的简单路径数量显然等于边两侧节点x,y子树大小的乘积. 我们知道裸的LCT只能维护链的信息,那么怎么维护子树大小呢?我们只需要对于节点x维护x的所有虚儿子的子树大小之和vir.那么查询的时候先split(x,y),这样x到y就成为了实链,其他与x相连的节点都是虚儿子.那么x一侧的子树大小就是vir[x]+1,y一侧的子树大小就是vir[y]+1 考虑虚子树大小…
鉴于最近写bzoj还有51nod都出现写不动的现象,决定学习一波厉害的算法/数据结构. link cut tree:研究popoqqq那个神ppt. bzoj1036:维护access操作就可以了. #include<cstdio> #include<cstring> #include<cctype> #include<algorithm> #include<queue> using namespace std; #define rep(i,s,…
A. Link/Cut Tree 题目连接: http://www.codeforces.com/contest/614/problem/A Description Programmer Rostislav got seriously interested in the Link/Cut Tree data structure, which is based on Splay trees. Specifically, he is now studying the expose procedure…
Link/cut Tree 一棵link/cut tree是一种用以表示一个森林,一个有根树集合的数据结构.它提供以下操作: 向森林中加入一棵只有一个点的树. 将一个点及其子树从其所在的树上断开. 将一个点连接至另一个顶点,作为其子节点. 求出一个点所在树的根.通过对两个不同的点进行此操作,我们可以判断他们是否属于同一棵树. (翻译自Link/cut tree - Wikipedia,英语好的小伙伴看这个就很不错) 在link/cut tree中,边分为两种:偏爱边(preferred edge…
link cut tree入门题 首先说明本人只会写自底向上的数组版(都说了不写指针.不写自顶向下QAQ……) 突然发现link cut tree不难写... 说一下各个函数作用: bool isroot(int x):判断x是否为所在重链(splay)的根 void down(int x):下放各种标记 void rotate(int x):在x所在重链(splay)中将x旋转到fa[x]的位置上 void splay(int x):在x坐在重链(splay)中将x旋转到根 void acce…
A - Link/Cut Tree Programmer Rostislav got seriously interested in the Link/Cut Tree data structure, which is based on Splay trees. Specifically, he is now studying the exposeprocedure. Unfortunately, Rostislav is unable to understand the definition…
Problem description Programmer Rostislav got seriously interested in the Link/Cut Tree data structure, which is based on Splay trees. Specifically, he is now studying the exposeprocedure. Unfortunately, Rostislav is unable to understand the definitio…
[BZOJ 2002] [HNOI2010]弹飞绵羊(Link Cut Tree) 题面 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置设定初始弹力系数ki,当绵羊达到第i个装置时,它会往后弹ki步,达到第i+ki个装置,若不存在第i+ki个装置,则绵羊被弹飞.绵羊想知道当它从第i个装置起步时,被弹几次后会被弹飞.为了使得游戏更有趣,Lostmonkey可以修改某个弹…
A. Link/Cut Tree time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Programmer Rostislav got seriously interested in the Link/Cut Tree data structure, which is based on Splay trees. Specifica…
模板参考:https://blog.csdn.net/saramanda/article/details/55253627 综合各位大大博客后整理的模板: #include<iostream> #include<cstdio> using namespace std; + ; struct LCT { struct node { ]; //父亲(Splay对应的链向上由轻边连着哪个节点).左右儿子 int reverse;//区间反转标记 bool is_root; //是否是所在…
概念.性质简述 首先介绍一下链剖分的概念链剖分,是指一类对树的边进行轻重划分的操作,这样做的目的是为了减少某些链上的修改.查询等操作的复杂度.目前总共有三类:重链剖分,实链剖分和并不常见的长链剖分. 重链剖分 实际上我们经常讲的树剖,就是重链剖分的常用称呼.对于每个点,选择最大的子树,将这条连边划分为重边,而连向其他子树的边划分为轻边.若干重边连接在一起构成重链,用树状数组或线段树等静态数据结构维护.这里就不赘述: 实链剖分 同样将某一个儿子的连边划分为实边,而连向其他子树的边划分为虚边.区别在…
网上一片一片的LCT都是数组写的 orz 用指针写splay的人想用指针写LCT找板子都不好找QAQ 所以能A题了之后自然要来回报社会, 把自己的板子丢上来(然而根本没有人会看) LCT讲解就省省吧, 我这种蒟蒻也基本讲不清楚, 就扔个板子算了 板子里也没什么注释, 因为函数的命名和世界的主流命名规范是一样的.. 那就这样吧.. 贴两道题的板子. 第一个是SDOI2008 Cave洞穴勘测, 一道简单判断连通性的LCT裸题. 三种操作; 连x,y 保证连完还是棵树 断x,y 保证<x,y>边存…