本来是想做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模板(指针版)的更多相关文章

  1. 字典树模板( 指针版 && 数组版 )

    模板 :  #include<string.h> #include<stdio.h> #include<malloc.h> #include<iostream ...

  2. 指针版P3690 【模板】Link Cut Tree (动态树)

    题面 传送门 题解 鉴于数组版实在是太慢我用指针版重新写了一遍 代码基本是借鉴了lxl某道关于\(LCT\)的题 //minamoto #include<bits/stdc++.h> #d ...

  3. hdu 1277 AC自动机入门(指针版和数组版)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1277 推荐一篇博客(看思路就可以,实现用的是java): https://www.cnblogs.co ...

  4. LCT模板

    之前一直用的LCT模板,因为其实个人对LCT和Splay不是很熟,所以用起来总觉得略略的坑爹,过了一段时间就忘了,但事实上很多裸的LCT要改的东西是不多的,所以今天写了些注释,以后可能套起模板来会得心 ...

  5. LCT 模板及套路总结

    这一个月貌似已经考了无数次\(LCT\)了..... 保险起见还是来一发总结吧..... A. LCT 模板 \(LCT\) 是由大名鼎鼎的 \(Tarjan\) 老爷发明的. 主要是用来维护树上路径 ...

  6. 非旋treap (fhq treap) 指针版

    传送门 看了一圈,好像真的没什么用指针的呢.. 明明觉得指针很好看(什么??你说RE???听不见听不见) 其实我觉得用数组的话不RE直接WA调起来不是更困难嘛,毕竟通过gdb还可以知道哪里RE,WA就 ...

  7. [洛谷P1501] [国家集训队]Tree II(LCT模板)

    传送门 这是一道LCT的板子题,说白了就是在LCT上支持线段树2的操作. 所以我只是来存一个板子,并不会讲什么(再说我也不会,只能误人子弟2333). 不过代码里的注释可以参考一下. Code #in ...

  8. LuoguP3690 【模板】Link Cut Tree (动态树) LCT模板

    P3690 [模板]Link Cut Tree (动态树) 题目背景 动态树 题目描述 给定n个点以及每个点的权值,要你处理接下来的m个操作.操作有4种.操作从0到3编号.点从1到n编号. 0:后接两 ...

  9. 指针版的PStash(用一个void指针数组, 来保存存入元素的地址) 附模板化实现 p321

    由容器PStash的使用者,负责清除容器中的所有指针.所以用户必须记住放到容器中的是什么类型,在取出时,把取出的void指针转换成对应的类型指针,然后 'delete 转换后的对象指针',才能在清除时 ...

随机推荐

  1. springboot启动后总是自己shutdown

    现象 这几天一直被一个问题困扰,每次springboot的tomcat启动之后, 然后过了一段时间看, 进程就突然自己关闭掉了. 然后日志是: ationConfigEmbeddedWebApplic ...

  2. IntelliJ IDEA下自动生成Hibernate映射文件以及实体类

    来自:https://blog.csdn.net/chenyunqiang/article/details/81026823 1.构建项目并添加项目结构配置以及配置初始参数 1.1.如图将基本的架子搭 ...

  3. 快速零配置迁移 API 适配 iOS 对 IPv6 以及 HTTPS 的要求

    本文快速分享一下快速零配置迁移 API 适配 iOS 对 IPv6 以及 HTTPS 的要求的方法,供大家参考. 原文发表于我的技术博客 零配置方案 最新的苹果审核政策对 API 的 IPv6 以及 ...

  4. tomcat相关配置技巧梳理 (修改站点目录、多项目部署、限制ip访问、大文件上传超时等)

    tomcat常用架构:1)nginx+tomcat:即前端放一台nginx,然后通过nginx反向代理到tomcat端口(可参考:分享一例测试环境下nginx+tomcat的视频业务部署记录)2)to ...

  5. 基于 CentOS 搭建 FTP 文件服务

    https://www.linuxidc.com/Linux/2017-11/148518.htm

  6. 跟踪分析Linux内核的启动过程

    潘俊洋 原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.准备 搭建环境 1 2 ...

  7. hash函数补分博客

    题目要求: 利用除留余数法为下列关键字集合的存储设计hash函数,并画出分别用开放寻址法和拉链法解决冲突得到的空间存储状态(散列因子取0.75) 关键字集合:85,75,57,60,65,(你的8位学 ...

  8. 阅读<构建之法>第10、11、12章

    第10章 典型用户和场景 10.2 规格说明书 10.3 功能驱动的设计 问题:怎样写好spec?功能驱动设计的功能设计阶段怎样实现一个具体的功能? 第11章 软件设计与实现 11.2开发阶段的日常管 ...

  9. Maven的课堂笔记1

    1 什么是maven? Maven是一个跨平台的项目管理工具,主要用于基于java平台的项目构建,依赖管理. Clean  compile  test  package  install   run ...

  10. 利用ini_set()函数实现对php配置文件的修改

    PHP的配置文件是php.ini,如果要开启或者关闭扩展,还有设置一些模块的相关配置是,就得对该文件进行修改, 修改的方法也很简单,打开php.ini找到对应项直接修改,修改之后需要重新启动才能生效. ...