Link-Cut Tree指针模板
模板:
以下为弹飞绵羊代码:
#define Troy
#include "bits/stdc++.h"
using namespace std;
const int N=2e5+;
inline int read(){
int s=,k=;char ch=getchar();
while(ch<''|ch>'') ch=='-'?k=-:,ch=getchar();
while(ch>&ch<='') s=s*+(ch^),ch=getchar();
return s*k;
}
#define size(t) (t?t->size:0)
#define rev(t) (t?t->rev^=1:0)
struct Node{
int size,rev;
Node *fa,*son[];
Node(){fa=son[]=son[]=NULL;size=,rev=;}
inline void update(){
size=+size(son[])+size(son[]);
}
inline void pushdown(){
if(!rev) return;
rev=,swap(son[],son[]);
rev(son[]),rev(son[]);
}
}*pool[N],*tmp[N],tree[N];int top;
inline void init_pool(){for(;top<N;++top) pool[top]=tree+top;}
inline void newNode(Node *&p,Node *f){p=pool[--top];*p=Node();p->fa=f;}
inline void freeNode(Node *&p){pool[top++]=p,p=NULL;}
int to[N],n;
class LinkCutTree{
public:
Node *node[N];
inline void init(int n){for(register int i=;i<=n;++i)newNode(node[i],NULL);}
#define son(p) (p->fa->son[1]==p)
#define is_root(p) ((!p->fa)||(p->fa->son[0]!=p&&p->fa->son[1]!=p))
inline void rotate(Node *p){
int a=son(p)^;Node *f=p->fa;
f->son[a^]=p->son[a];
if(p->son[a]) p->son[a]->fa=f;
p->fa=f->fa;
if(!is_root(f)) p->fa->son[son(f)]=p;
f->fa=p,p->son[a]=f,f->update(),p->update();
}
inline void splay(Node *p){
register int pos=;
for(Node *t=p;;t=t->fa){
tmp[++pos]=t;
if(is_root(t)) break;
}
for(;pos;--pos) tmp[pos]->pushdown();
for(;!is_root(p);rotate(p))
if(!is_root(p->fa)) rotate(son(p)==son(p->fa)?p->fa:p);
}
inline void access(Node *p){
for(Node *pre=NULL;p;pre=p,p=p->fa)
splay(p),p->son[]=pre,p->update();
}
inline void make_root(Node *p){
access(p),splay(p),rev(p);
}
inline void cut(Node *x,Node *y){
make_root(x),access(y),splay(y);
x->fa=y->son[]=NULL;y->update();
}
inline void link(Node *x,Node *y){make_root(x);x->fa=y;}
inline void link(int x,int y){node[x]->fa=node[y];}
inline void op1(int x){
make_root(node[n+]),access(node[x]),splay(node[x]);
printf("%d\n",node[x]->size-);
}
inline void op2(int x,int y){
cut(node[x],node[min(n+,x+to[x])]);
link(node[x],node[min(n+,y+x)]);to[x]=y;
}
}lct;
int main(){
n=read();
init_pool();
lct.init(n+);
register int i;
for(i=;i<=n;++i){
to[i]=read();
lct.link(i,min(i+to[i],n+));
}
int q=read(),x,y;
while(q--){
if(read()==)
lct.op1(read()+);
else{
x=read(),y=read();
lct.op2(x+,y);
}
}return ;
}
Link-Cut Tree指针模板的更多相关文章
- Luogu 3690 Link Cut Tree
Luogu 3690 Link Cut Tree \(LCT\) 模板题.可以参考讲解和这份码风(个人认为)良好的代码. 注意用 \(set\) 来维护实际图中两点是否有直接连边,否则无脑 \(Lin ...
- 洛谷P3690 Link Cut Tree (模板)
Link Cut Tree 刚开始写了个指针版..调了一天然后放弃了.. 最后还是学了黄学长的板子!! #include <bits/stdc++.h> #define INF 0x3f3 ...
- LCT总结——概念篇+洛谷P3690[模板]Link Cut Tree(动态树)(LCT,Splay)
为了优化体验(其实是强迫症),蒟蒻把总结拆成了两篇,方便不同学习阶段的Dalao们切换. LCT总结--应用篇戳这里 概念.性质简述 首先介绍一下链剖分的概念(感谢laofu的讲课) 链剖分,是指一类 ...
- P3690 【模板】Link Cut Tree (动态树)
P3690 [模板]Link Cut Tree (动态树) 认父不认子的lct 注意:不 要 把 $fa[x]$和$nrt(x)$ 混 在 一 起 ! #include<cstdio> v ...
- 【刷题】洛谷 P3690 【模板】Link Cut Tree (动态树)
题目背景 动态树 题目描述 给定n个点以及每个点的权值,要你处理接下来的m个操作.操作有4种.操作从0到3编号.点从1到n编号. 0:后接两个整数(x,y),代表询问从x到y的路径上的点的权值的xor ...
- LG3690 【模板】Link Cut Tree (动态树)
题意 给定n个点以及每个点的权值,要你处理接下来的m个操作.操作有4种.操作从0到3编号.点从1到n编号. 0:后接两个整数(x,y),代表询问从x到y的路径上的点的权值的xor和.保证x到y是联通的 ...
- AC日记——【模板】Link Cut Tree 洛谷 P3690
[模板]Link Cut Tree 思路: LCT模板: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 30 ...
- 洛谷P3690 [模板] Link Cut Tree [LCT]
题目传送门 Link Cut Tree 题目背景 动态树 题目描述 给定n个点以及每个点的权值,要你处理接下来的m个操作.操作有4种.操作从0到3编号.点从1到n编号. 0:后接两个整数(x,y),代 ...
- LG3690 【模板】Link Cut Tree 和 SDOI2008 洞穴勘测
UPD:更新了写法. [模板]Link Cut Tree 给定n个点以及每个点的权值,要你处理接下来的m个操作.操作有4种.操作从0到3编号.点从1到n编号. 后接两个整数(x,y),代表询问从x到y ...
- (RE) luogu P3690 【模板】Link Cut Tree
二次联通门 : luogu P3690 [模板]Link Cut Tree 莫名RE第8个点....如果有dalao帮忙查错的话万分感激 #include <cstdio> #includ ...
随机推荐
- html5中的全局属性
在html5中,新增了一个"全局属性"的概念,所谓全局属性,是指可以对任何属性都使用的属性.下面列出常用的全局属性. 1.contentEditable属性,是微软开发的,该属性主 ...
- 搭建spring cloud config
很久没更新了,因为不是专职研究spring cloud,因此更新速度得看工作强度大不大,每天能抽出的时间不多,如果更新太慢了,并且有小伙伴看的话,请见谅了. Spring Cloud简介 Spring ...
- [ SSH框架 ] Hibernate框架学习之三
一.表关系的分析 Hibernate框架实现了ORM的思想,将关系数据库中表的数据映射成对象,使开发人员把对数据库的操作转化为对对象的操作,Hibernate的关联关系映射主要包括多表的映射配置.数据 ...
- jvm栈-运行控制,jvm-堆运行存储共享单元
JVM-栈 2012-09-17 15:43:53 分类: Java 原文转自:http://www.blogjava.net/nkjava/archive/2012/03/15/371971.ht ...
- andorid下从相册选取/拍照选取一张相片并剪切
http://www.2cto.com/kf/201401/270144.html 在Android编程中,从相册选取或是拍照选取一张照片然后对其进行剪切的需求非常的多 之前的一篇文章只说到如何从相册 ...
- UE4中如何使物体始终朝向摄像头?
要使物体始终正面朝向摄像头需要用到一个关键节点:Find Look at Rotation 其中Start连接需要旋转的物体位置矢量,Target连接摄像头位置矢量 最后设置SetActorRotat ...
- Python 内置的一些高效率函数用法
1. filter(function,sequence) 将sequence中的每个元素,依次传进function函数(可以自定义,返回的结果是True或者False)筛选,返回符合条件的元素,重组 ...
- zabbix 3.4 ubuntu 16 用腾讯企业邮箱作为告警邮箱
最近一直在研究zabbix监控系统,今天调试了腾讯企业邮箱作为告警邮箱的设置,本次方式是用内置email组件. 第一步: 选择Administration-->Media Types--> ...
- 软件及博客的markdown支持度的评测
软件 vscode vscode原生支持markdown,但对数学公式的支持不太好,用 $$包含的数学公式不支持换行,而且在数学公式里面不能输入中文 Typora 非常简洁优美的软件,只有预览页,没有 ...
- C#现代代码风格指南
参考资料: asp.net 主页仓库 代码风格 -- 一般原则 最通用的指导原则是我们使用所有的VS默认设置的代码格式,除了我们把系统命名空间放在其他命名空间之前(这在VS中是默认的,但是在VS的更新 ...