LCT模板(指针版)
本来是想做THUWC2017的泰勒展开xLCT题的……
然后觉得数组写很麻烦……
然后就决定挑战指针版……
然后写得全是BUG……
与BUG鏖战三千年后,有了这个指针版LCT板子!
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <iostream>
#define space putchar(' ')
#define enter putchar('\n')
using namespace std;
typedef long long ll;
template <class T>
void read(T &x){
char c;
bool op = 0;
while(c = getchar(), c < '0' || c > '9')
if(c == '-') op = 1;
x = c - '0';
while(c = getchar(), c >= '0' && c <= '9')
x = x * 10 + c - '0';
if(op) x = -x;
}
template <class T>
void write(T x){
if(x < 0) putchar('-'), x = -x;
if(x >= 10) write(x / 10);
putchar('0' + x % 10);
}
typedef long double ldb;
const int N = 300005;
int n, m;
struct node {
node *fa, *ch[2];
int val, sum;
bool rev;
node(){
fa = ch[0] = ch[1] = NULL;
val = sum = 0;
rev = 0;
}
bool which(){
return fa->ch[1] == this;
}
bool isroot(){
return fa == NULL || (fa->ch[0] != this && fa->ch[1] != this);
}
void upt(){
sum = val;
if(ch[0] != NULL) sum ^= ch[0]->sum;
if(ch[1] != NULL) sum ^= ch[1]->sum;
}
void pushdown(){
if(!rev) return;
swap(ch[0], ch[1]);
if(ch[0] != NULL) ch[0]->rev ^= 1;
if(ch[1] != NULL) ch[1]->rev ^= 1;
rev = 0;
}
} s[N];
void rotate(node *u){
node *v = u->fa, *w = v->fa, *b = u->ch[!u->which()];
if(!v->isroot()) w->ch[v->which()] = u;
u->which() ? (u->ch[0] = v, v->ch[1] = b) : (u->ch[1] = v, v->ch[0] = b);
u->fa = w, v->fa = u;
if(b != NULL) b->fa = v;
v->upt();
}
void splay(node *u){
static node *stk[N];
int top;
stk[top = 1] = u;
while(!stk[top]->isroot()) stk[top + 1] = stk[top]->fa, top++;
while(top) stk[top--]->pushdown();
while(!u->isroot()){
if(!u->fa->isroot()){
if(u->which() == u->fa->which()) rotate(u->fa);
else rotate(u);
}
rotate(u);
}
u->upt();
}
void access(node *u){
node *v = NULL;
while(u != NULL){
splay(u);
u->ch[1] = v;
u->upt();
v = u;
u = u->fa;
}
}
void makeroot(node *u){
access(u);
splay(u);
u->rev ^= 1;
}
node *findroot(node *u){
access(u);
splay(u);
while(u->pushdown(), u->ch[0] != NULL)
u = u->ch[0];
splay(u);
return u;
}
void link(node *u, node *v){
if(findroot(u) == findroot(v)) return;
makeroot(v);
v->fa = u;
}
void cut(node *u, node *v){
makeroot(u);
access(v);
splay(v);
if(v->ch[0] == u)
v->ch[0] = u->fa = NULL;
}
int query(node *u, node *v){
makeroot(u);
access(v);
splay(v);
return v->sum;
}
void change(node *u, int x){
splay(u);
u->val = x;
u->upt();
}
int main(){
read(n), read(m);
for(int i = 1; i <= n; i++)
read(s[i].val), s[i].upt();
int op, x, y;
while(m--){
read(op), read(x), read(y);
if(op == 0) write(query(s + x, s + y)), enter;
else if(op == 1) link(s + x, s + y);
else if(op == 2) cut(s + x, s + y);
else change(s + x, y);
}
return 0;
}
LCT模板(指针版)的更多相关文章
- 字典树模板( 指针版 && 数组版 )
模板 : #include<string.h> #include<stdio.h> #include<malloc.h> #include<iostream ...
- 指针版P3690 【模板】Link Cut Tree (动态树)
题面 传送门 题解 鉴于数组版实在是太慢我用指针版重新写了一遍 代码基本是借鉴了lxl某道关于\(LCT\)的题 //minamoto #include<bits/stdc++.h> #d ...
- hdu 1277 AC自动机入门(指针版和数组版)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1277 推荐一篇博客(看思路就可以,实现用的是java): https://www.cnblogs.co ...
- LCT模板
之前一直用的LCT模板,因为其实个人对LCT和Splay不是很熟,所以用起来总觉得略略的坑爹,过了一段时间就忘了,但事实上很多裸的LCT要改的东西是不多的,所以今天写了些注释,以后可能套起模板来会得心 ...
- LCT 模板及套路总结
这一个月貌似已经考了无数次\(LCT\)了..... 保险起见还是来一发总结吧..... A. LCT 模板 \(LCT\) 是由大名鼎鼎的 \(Tarjan\) 老爷发明的. 主要是用来维护树上路径 ...
- 非旋treap (fhq treap) 指针版
传送门 看了一圈,好像真的没什么用指针的呢.. 明明觉得指针很好看(什么??你说RE???听不见听不见) 其实我觉得用数组的话不RE直接WA调起来不是更困难嘛,毕竟通过gdb还可以知道哪里RE,WA就 ...
- [洛谷P1501] [国家集训队]Tree II(LCT模板)
传送门 这是一道LCT的板子题,说白了就是在LCT上支持线段树2的操作. 所以我只是来存一个板子,并不会讲什么(再说我也不会,只能误人子弟2333). 不过代码里的注释可以参考一下. Code #in ...
- LuoguP3690 【模板】Link Cut Tree (动态树) LCT模板
P3690 [模板]Link Cut Tree (动态树) 题目背景 动态树 题目描述 给定n个点以及每个点的权值,要你处理接下来的m个操作.操作有4种.操作从0到3编号.点从1到n编号. 0:后接两 ...
- 指针版的PStash(用一个void指针数组, 来保存存入元素的地址) 附模板化实现 p321
由容器PStash的使用者,负责清除容器中的所有指针.所以用户必须记住放到容器中的是什么类型,在取出时,把取出的void指针转换成对应的类型指针,然后 'delete 转换后的对象指针',才能在清除时 ...
随机推荐
- .NET开发微信小程序-生成二维码 - 转
1.生成小程序二维码功能 直接请求相应的链接.传递相应的参数 以生成商铺的付款码为例: var shopsId = e.ShopsId //付款码的参数 var codeModel = new fun ...
- sqlserver 隔离级别 - 转
SQL-92标准中定义了四个隔离级别,这四个隔离级别在以前版本的SQL Server中即受到支持: READ UNCOMMITTED READ UNCOMMITTED是限制性最弱的隔离级别,因为该级别 ...
- sql语句——行列互换
SELECT 年份, SUM(case when 季度=1 then 销量 else 0 end) as 一季度, SUM(case when 季度=2 then 销量 else 0 end) as ...
- P5204 [USACO19JAN]Train Tracking 2
P5204 [USACO19JAN]Train Tracking 2 毒毒题,对着嘤文题解看了贼久 首先考虑此题的一个弱化版本:如果输入的所有\(c_i\)相等怎么做 现在假设有\(len\)个数,取 ...
- Java HTML to PDF 支持SVG
尝试一 (现用框架的基础上改动,影响最小化) 最早使用的框架 Xhtmlrenderer,需要把HTML转换成XHTML,引入第二个框架Tidy,Tidy与2010年停止更新,github上的项目也停 ...
- Mvc_前后端绑定数据json集合
ViewBag.SysModuleList =new List<SysModule>(){.....}; var data = @Html.Raw(Json.Encode(ViewBag ...
- Linux下DNS服务(Bind9)之Web管理利器-NamedManager部署说明
NamedManager 是一个基于Web的DNS管理系统,可用来添加.调整和删除DNS的zones/records数据.它使用Bind作为底层DNS服务,提供一个现代Ajax的Web界面,支持 IP ...
- Git常用命令梳理
在日常的Git版本库管理工作中用到了很多操作命令,以下做一梳理: 查看分支列表,带有*的分支表示是当前所在分支 [root@115~~]#git branch 查看分支详细情况 (推荐这种方式) [r ...
- C++STL——优先队列
一.相关定义 优先队列容器与队列一样,只能从队尾插入元素,从队首删除元素.但是它有一个特性,就是队列中最大的元素总是位于队首,所以出队时,并非按照先进先出的原则进行,而是将当前队列中最大的元素出队.这 ...
- mybatis分页 -----PageHelper插件
对查询结果进行分页 一,使用limit进行分页 1.mybatis 的sql语句: <if test="page !=null and rows !=null"> li ...