Dynamic LCA

Time Limit: 2000ms
Memory Limit: 262144KB

This problem will be judged on CodeForcesGym. Original ID: 100512D
64-bit integer IO format: %I64d      Java class name: (Any)

解题:LCT
 #include <bits/stdc++.h>
using namespace std;
const int maxn = ;
struct arc {
int to,next;
arc(int x = ,int y = -) {
to = x;
next = y;
}
} e[maxn<<];
int head[maxn],tot;
void add(int u,int v) {
e[tot] = arc(v,head[u]);
head[u] = tot++;
}
struct LCT {
int fa[maxn],ch[maxn][],parent[maxn],flip[maxn];
inline void pushdown(int x) {
if(flip[x]) {
flip[ch[x][]] ^= ;
flip[ch[x][]] ^= ;
swap(ch[x][],ch[x][]);
flip[x] = ;
}
}
void build(int u,int v) {
fa[v] = ch[v][] = ch[v][] = ;
flip[v] = ;
parent[v] = u;
}
void rotate(int x,int kd) {
int y = fa[x];
pushdown(y);
pushdown(x);
ch[y][kd^] = ch[x][kd];
fa[ch[x][kd]] = y;
fa[x] = fa[y];
ch[x][kd] = y;
fa[y] = x;
if(fa[x]) ch[fa[x]][y == ch[fa[x]][]] = x;
}
void splay(int x,int goal = ) {
int y = x;
while(fa[y]) y = fa[y];
pushdown(x);
if(x != y) {
parent[x] = parent[y];
parent[y] = ;
while(fa[x] != goal) {
pushdown(fa[fa[x]]);
pushdown(fa[x]);
pushdown(x);
if(fa[fa[x]] == goal) rotate(x,x == ch[fa[x]][]);
else {
int y = fa[x],z = fa[y],s = (y == ch[z][]);
if(x == ch[y][s]) {
rotate(x,s^);
rotate(x,s);
} else {
rotate(y,s);
rotate(x,s);
}
}
}
}
}
void access(int x) {
for(int y = ; x; x = parent[x]) {
splay(x);
fa[ch[x][]] = ;
parent[ch[x][]] = x;
ch[x][] = y;
fa[y] = x;
parent[y] = ;
y = x;
}
}
int LCA(int x,int y) {
access(y);
splay(y);
for(int z = x; z; z = parent[z]) {
splay(z);
if(!parent[z]) return z;
}
return -;
}
void makeroot(int x) {
access(x);
splay(x);
flip[x] ^= ;
}
void init(){
memset(flip,,sizeof flip);
memset(ch,,sizeof ch);
memset(parent,,sizeof parent);
memset(fa,,sizeof fa);
}
} lct;
void dfs(int u,int fa) {
for(int i = head[u]; ~i; i = e[i].next) {
if(e[i].to == fa) continue;
lct.build(u,e[i].to);
dfs(e[i].to,u);
}
}
int main() {
#define NAME "dynamic"
freopen(NAME".in","r",stdin);
freopen(NAME".out","w",stdout);
int n,m,u,v;
char op[];
while(scanf("%d",&n),n) {
memset(head,-,sizeof head);
tot = ;
lct.init();
for(int i = ; i < n; ++i) {
scanf("%d%d",&u,&v);
add(u,v);
add(v,u);
}
lct.build(,);
dfs(,);
scanf("%d",&m);
while(m--) {
scanf("%s%d",op,&u);
if(op[] == '!') lct.makeroot(u);
else if(op[] == '?') {
scanf("%d",&v);
printf("%d\n",lct.LCA(u,v));
}
}
}
return ;
}
/*
9
1 2
1 3
2 4
2 5
3 6
3 7
6 8
6 9
10
? 4 5
? 5 6
*/

CodeForcesGym 100512D Dynamic LCA的更多相关文章

  1. SP8791 DYNALCA - Dynamic LCA 解题报告

    SP8791 DYNALCA - Dynamic LCA 有一个森林最初由 \(n (1 \le n \le 100000)\) 个互不相连的点构成 你需要处理以下操作: link A B:添加从顶点 ...

  2. 【题解】Luogu SP8791 DYNALCA - Dynamic LCA

    原题传送门 这题用Link-Cut-Tree解决,Link-Cut-Tree详解 这道题的难点就在如何求LCA: 我们珂以先对其中一个点进行access操作,然后对另一个点进行access操作,因为L ...

  3. SP8791 DYNALCA - Dynamic LCA

    \(\color{#0066ff}{ 题目描述 }\) 有一个森林最初由 n (\(1 \le n \le 100000\))n(\(1\leq n\leq 100000\)) 个互不相连的点构成 你 ...

  4. spoj DYNALCA - Dynamic LCA

    http://www.spoj.com/problems/DYNALCA/ 此题link.cut要求不能换根,当然也保证link时其中一个点必定已经是根. 方法: void link(Node *x, ...

  5. 主席树[可持久化线段树](hdu 2665 Kth number、SP 10628 Count on a tree、ZOJ 2112 Dynamic Rankings、codeforces 813E Army Creation、codeforces960F:Pathwalks )

    在今天三黑(恶意评分刷上去的那种)两紫的智推中,突然出现了P3834 [模板]可持久化线段树 1(主席树)就突然有了不详的预感2333 果然...然后我gg了!被大佬虐了! hdu 2665 Kth ...

  6. CodeForcesGym 100676G Training Camp

    G. Training Camp Time Limit: 1000ms Memory Limit: 262144KB This problem will be judged on CodeForces ...

  7. P6845 [CEOI2019] Dynamic Diameter

    P6845 [CEOI2019] Dynamic Diameter 题意 一颗带权树,每次更改一条边的权,每次修改后求出最大直径.强制在线. 思路 \(O(n\log^2n)\) 的暴力做法. 根据经 ...

  8. var和dynamic的区别

    1.var 1.均是声明动态类型的变量. 2.在编译阶段已经确定类型,在初始化的时候必须提供初始化的值. 3.无法作为方法参数类型,也无法作为返回值类型. 2.dynamic 1.均是声明动态类型的变 ...

  9. BZOJ 3083: 遥远的国度 [树链剖分 DFS序 LCA]

    3083: 遥远的国度 Time Limit: 10 Sec  Memory Limit: 1280 MBSubmit: 3127  Solved: 795[Submit][Status][Discu ...

随机推荐

  1. 暑期训练狂刷系列——Lightoj 1084 - Winter bfs

    题目连接: http://www.lightoj.com/volume_showproblem.php?problem=1084 题目大意: 有n个点在一条以零为起点的坐标轴上,每个点最多可以移动k, ...

  2. python优缺点分析及python种类

    Python的缺点: 相较于其它类型的语言可能运行速度上会略差.C语言的运行性能速度上最好,因为C最接近计算机底层. Python的优点: 大数据处理,有专门的功能模块,比较方便. Linux自带Py ...

  3. ACM_逆序数(归并排序)

    帮挂科 Time Limit: 2000/1000ms (Java/Others) 64bit IO Format: %lld & %llu Problem Description: 冬瓜发现 ...

  4. RHEL5.6环境下Oracle10g单主机安装步骤记录

    操作环境:RedHat Enterprise Linux 5.6 安装版本:Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64 ...

  5. 动态规划:最大连续子序列乘积 分类: c/c++ 算法 2014-09-30 17:03 656人阅读 评论(0) 收藏

    题目描述: 给定一个浮点数序列(可能有正数.0和负数),求出一个最大的连续子序列乘积. 分析:若暴力求解,需要O(n^3)时间,太低效,故使用动态规划. 设data[i]:第i个数据,dp[i]:以第 ...

  6. js中实现json格式的转换

    function person(id,name,age){ this.id=id; this.name=name; this.age=age; } var p=new person(1001,'tom ...

  7. [转]Using the Repository Pattern with ASP.NET MVC and Entity Framework

    本文转自:http://www.codeguru.com/csharp/.net/net_asp/mvc/using-the-repository-pattern-with-asp.net-mvc-a ...

  8. java_dom4j解析xml

    package forRQ; import java.io.File;import java.net.MalformedURLException;import java.util.Iterator;i ...

  9. 第一次阅读作业 xinzcover

    ---恢复内容开始--- 第一次阅读和准备作业 这个作业属于哪个课程 https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass1 这个作 ...

  10. tensorboard及summary data

    (新手上路,如果有不对的地方,望指正.另外有没有小伙伴一起学习交流啊?)   tensorboard为tensorflow提供了可视化,它的重要性不言而喻.   tensorboard是通过读取eve ...