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 转换后的对象指针',才能在清除时 ...
随机推荐
- 【福利】送Spark大数据平台视频学习资料
没有套路真的是送!! 大家都知道,大数据行业spark很重要,那话我就不多说了,贴心的大叔给你找了份spark的资料. 多啰嗦两句,一个好的程序猿的基本素养是学习能力和自驱力.视频给了你们,能不能 ...
- MVC 使用cshtml的一些基础知识-和相关整理
首先在认识cshtml之前,先要了解一下Razor视图引擎 如果对此有疑问的话可以借鉴 博客园博文:http://kb.cnblogs.com/page/96883/ 或 博客博文:http://ww ...
- 记一次拿webshell踩过的坑(如何用PHP编写一个不包含数字和字母的后门)
0x01 前言 最近在做代码审计的工作中遇到了一个难题,题目描述如下: <?php include 'flag.php'; if(isset($_GET['code'])){ $code = $ ...
- sqli-labs less 5-6
sqli-labs less 5-6 从源代码中可以看到,运行返回结果正确的时候只返回you are in....,不会返回数据库当中的信息了,以前的union联合查询就不能用了,开始尝试盲注. 简单 ...
- Docker容器学习梳理 - 基础环境安装
以下是centos系统安装docker的操作记录 1)第一种方法:采用系统自带的docker安装,但是这一般都不是最新版的docker安装epel源[root@docker-server ~]# wg ...
- Jmeter(GUI模式)教程
前些天,领导让我做接口的压力测试.What??我从未接触过这方面,什么都不知道,一脸蒙.于是我从学习jmeter开始入手. 现在记录下来jmeter的使用步骤,希望能对大家有所帮助. 一.安装Jmet ...
- C. Banh-mi
链接 [http://codeforces.com/contest/1062/problem/C] 题意 给你有n个字符(0 or 1)的串,当去某个位置时所有的剩下的位置都加上这个位置的数字,q次查 ...
- [BUAA软工]第二次博客作业---结对编程
[BUAA软工]结对作业 项目 内容 这个作业属于哪个课程 北航软工 这个作业的要求在哪里 2019年软件工程基础-结对项目作业 我在这个课程的目标是 学习如何以团队的形式开发软件,提升个人软件开发能 ...
- 20135337——Linux实践二:模块
一.编译&生成&测试&删除 1.编写模块代码,查看如下 gedit 1.c(编写) cat 1.c(查看) MODULE_AUTHOR("Z") MODUL ...
- github学习心得
1.在GitHub上建立项目登录GitHub后,你可以在右边靠中那里找到一个按钮“New Repository”,点击过后,填入项目名称.说明和网址过后就可以创建.2.配置Git以及上传代码安装Git ...