SP8791 DYNALCA - Dynamic LCA 解题报告
SP8791 DYNALCA - Dynamic LCA
有一个森林最初由 \(n (1 \le n \le 100000)\) 个互不相连的点构成
你需要处理以下操作:
- link A B:添加从顶点A到B的边,使A成为B的子节点,其中保证A是一个根顶点,A和B在不同的树中。
 - cut A:切断点A到其父节点的边,保证A是一个非根节点。
 - lca A B:输出A和B的最近共同祖先,保证A和B在同一棵树中。
 
最开始我是这么写的
void LCA(int x,int y)
{
    access(x),splay(x),splay(y);
    while(par[y]) y=par[y],splay(y);
    printf("%d\n",y);
}
然后一直T
改成这个
int access(int now)
{
    int las=0;
    for(;now;las=now,now=fa)
        splay(now),rs=las;
    return las;
}
void LCA(int x,int y)
{
    access(x);
    printf("%d\n",access(y));
}
就过了
恩,需要虚实边转换,否则复杂度是假的
huyufeifei orz告诉我了这个问题
Code:
#include <cstdio>
#include <cctype>
#define fa par[now]
#define rs ch[now][1]
const int N=1e5+10;
template <class T>
inline void read(T &x)
{
    x=0;char c=getchar();
    while(!isdigit(c)) c=getchar();
    while(isdigit(c)) x=x*10+c-'0',c=getchar();
}
int ch[N][2],par[N];
bool isroot(int now){return ch[fa][0]==now||ch[fa][1]==now;}
int identity(int now){return ch[fa][1]==now;}
void connect(int f,int now,int typ){ch[fa=f][typ]=now;}
void Rotate(int now)
{
    int p=fa,typ=identity(now);
    connect(p,ch[now][typ^1],typ);
    if(isroot(p)) connect(par[p],now,identity(p));
    else fa=par[p];
    connect(now,p,typ^1);
}
void splay(int now)
{
    for(;isroot(now);Rotate(now))
        if(isroot(fa))
            Rotate(identity(now)^identity(fa)?now:fa);
}
int access(int now)
{
    int las=0;
    for(;now;las=now,now=fa)
        splay(now),rs=las;
    return las;
}
void LCA(int x,int y)
{
    access(x);
    printf("%d\n",access(y));
}
void Link(int x,int y)
{
    access(x),splay(x);
    par[x]=y;
}
void cat(int x)
{
    access(x),splay(x);
    par[ch[x][0]]=0;
    ch[x][0]=0;
}
int main()
{
    int n,m;char op[23];
    read(n),read(m);
    for(int x,y,i=1;i<=m;i++)
    {
        scanf("%s",op);
        if(op[1]=='i') read(x),read(y),Link(x,y);
        else if(op[1]=='u') read(x),cat(x);
        else read(x),read(y),LCA(x,y);
    }
    return 0;
}
2019.3.10
SP8791 DYNALCA - Dynamic LCA 解题报告的更多相关文章
- 【题解】Luogu SP8791 DYNALCA - Dynamic LCA
		
原题传送门 这题用Link-Cut-Tree解决,Link-Cut-Tree详解 这道题的难点就在如何求LCA: 我们珂以先对其中一个点进行access操作,然后对另一个点进行access操作,因为L ...
 - SP8791 DYNALCA - Dynamic LCA
		
\(\color{#0066ff}{ 题目描述 }\) 有一个森林最初由 n (\(1 \le n \le 100000\))n(\(1\leq n\leq 100000\)) 个互不相连的点构成 你 ...
 - spoj DYNALCA - Dynamic LCA
		
http://www.spoj.com/problems/DYNALCA/ 此题link.cut要求不能换根,当然也保证link时其中一个点必定已经是根. 方法: void link(Node *x, ...
 - 洛谷 P4211 [LNOI2014]LCA  解题报告
		
[LNOI2014]LCA 题意 给一个\(n(\le 50000)\)节点的有根树,询问\(l,r,z\),求\(\sum_{l\le i\le r}dep[lca(i,z)]\) 一直想启发式合并 ...
 - 洛谷 P2617 Dynamic Rankings 解题报告
		
P2617 Dynamic Rankings 题目描述 给定一个含有\(n\)个数的序列\(a[1],a[2],a[3],\dots,a[n]\),程序必须回答这样的询问:对于给定的\(i,j,k\) ...
 - CH Round #56 - 国庆节欢乐赛解题报告
		
最近CH上的比赛很多,在此会全部写出解题报告,与大家交流一下解题方法与技巧. T1 魔幻森林 描述 Cortana来到了一片魔幻森林,这片森林可以被视作一个N*M的矩阵,矩阵中的每个位置上都长着一棵树 ...
 - 习题:codevs 1519 过路费 解题报告
		
今天拿了这道题目练练手,感觉自己代码能力又增强了不少: 我的思路跟别人可能不一样. 首先我们很容易就能看出,我们需要的边就是最小生成树算法kruskal算法求出来的边,其余的边都可以删掉,于是就有了这 ...
 - 【NOIP2015】提高day2解题报告
		
题目: P1981跳石头 描述 一年一度的“跳石头”比赛又要开始了!这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选择好了两块岩石作为比赛起点和终点.在起点和终点之间,有 N ...
 - NOIP2015 提高组(senior) 解题报告
		
过了这么久才来发解题报告,蒟蒻实在惭愧 /w\ Day1 T1 [思路] 模拟 [代码] #include<iostream> #include<cstring> #inclu ...
 
随机推荐
- 多线程系列之十一:Two-Phase Termination模式
			
一,Two-Phase Termination模式 翻译过来就是:分两阶段终止 二,示例程序 public class CountupTread extends Thread { private lo ...
 - 使用Dockerfile来构建镜像
			
Dockerfile原理 创建Dockerfile Dockerfile实例 Dockerfile指令 注释 FROM MAINTAINER RUN ADD WORKDIR ENV USER COPY ...
 - js根据ip自动获取地址(省市区)
			
HTML: <html> <head> <meta charset="utf-8"> <meta name="viewport& ...
 - java的数据类型:基本数据类型和引用数据类型
			
Java数据类型的基本概念 数据类型在计算机语言里面,是对内存位置的一个抽象表达方式,可以理解为针对内存的一种抽象的表达方式. 开始接触每种语言的时候,都会存在对数据类型的认识,有复杂的,有复杂的,各 ...
 - linux之nload和iftop查看网络使用情况
			
操作系统: centos7 nload: yum install -y gcc yum install -y gcc-c++ yum install -y ncurses-devel yum inst ...
 - linux audit审计(8)--开启audit对系统性能的影响
			
我们使用测试性能的工具,unixbench,它有一下几项测试项目: Execl Throughput 每秒钟执行 execl 系统调用的次数 Pipe Throughput 一秒钟内一个进程向一个管道 ...
 - python数学第六天【指数族】
 - Delphi 限制Edit输入 多个例子
			
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); begin if not (key in [ '.',#8]) then ...
 - MySQL函数GROUP_CONCAT
			
该函数返回带有来自一个组的连接的非NULL值的字符串结果.该函数是一个增强的Sybase SQL Anywhere支持的基本LIST()函数. 语法结构: GROUP_CONCAT([DISTINCT ...
 - group by具有去重的功能
			
group by具有去重的功能