CodeForcesGym 100512D Dynamic LCA
Dynamic LCA
This problem will be judged on CodeForcesGym. Original ID: 100512D
64-bit integer IO format: %I64d Java class name: (Any)
#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的更多相关文章
- SP8791 DYNALCA - Dynamic LCA 解题报告
SP8791 DYNALCA - Dynamic LCA 有一个森林最初由 \(n (1 \le n \le 100000)\) 个互不相连的点构成 你需要处理以下操作: link A B:添加从顶点 ...
- 【题解】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, ...
- 主席树[可持久化线段树](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 ...
- CodeForcesGym 100676G Training Camp
G. Training Camp Time Limit: 1000ms Memory Limit: 262144KB This problem will be judged on CodeForces ...
- P6845 [CEOI2019] Dynamic Diameter
P6845 [CEOI2019] Dynamic Diameter 题意 一颗带权树,每次更改一条边的权,每次修改后求出最大直径.强制在线. 思路 \(O(n\log^2n)\) 的暴力做法. 根据经 ...
- var和dynamic的区别
1.var 1.均是声明动态类型的变量. 2.在编译阶段已经确定类型,在初始化的时候必须提供初始化的值. 3.无法作为方法参数类型,也无法作为返回值类型. 2.dynamic 1.均是声明动态类型的变 ...
- BZOJ 3083: 遥远的国度 [树链剖分 DFS序 LCA]
3083: 遥远的国度 Time Limit: 10 Sec Memory Limit: 1280 MBSubmit: 3127 Solved: 795[Submit][Status][Discu ...
随机推荐
- [POI2008]Sta
Description 给出一个N个点的树,找出一个点来,以这个点为根的树时,所有点的深度之和最大 Input 给出一个数字N,代表有N个点.N<=1000000 下面N-1条边. Output ...
- Tenegrad评价函数 分类: 图像处理 Opencv 2014-11-12 20:46 488人阅读 评论(0) 收藏
Tenegrad函数式一种常用的图像清晰度评价函数,是一种基于梯度的函数. 在图像处理中,一般认为对焦好的图像具有更尖锐的边缘,故具有更大的梯度函数值. Tenegrad函数使用Sobel算子提取水平 ...
- tac命令的实现 分类: linux 2014-06-02 00:08 344人阅读 评论(0) 收藏
此程序实现简化的linux中的tac命令.即对文件按行倒序输出. 首先将文件指针置于文件尾,从后向前移动指针, 将两个换行符'\n'间的内容作为一行输出. #include<stdio.h> ...
- fix for 12c profile
.for CDBS run as sysDBa CREATE OR REPLACE FUNCTION verify_function (username varchar2, password varc ...
- [转]ASP.NET MVC 3 Application Upgrader
本文转自:http://aspnet.codeplex.com/releases/view/59008 Recommended Download ASP.NET MVC 3 Applicat ...
- SQL表与表连接关系
一.SQL连接方式 left join :左连接,返回左表中所有的记录以及右表中连接字段相等的记录. right join :右连接,返回右表中所有的记录以及左表中连接字段相等的记录. inner j ...
- MAC加域重复跳出---"talagent"想使用“本地项目” 的钥匙串
很简单的解决办法,就是把以前的钥匙串给删掉就好 (重要提示:这个方法,以前所有程序自动记录密码都会丢掉,safari的自动填充,QQ自动登录,imessages 的等等) 1.打开Finder -&g ...
- leetcode_486. Predict the Winner
https://leetcode.com/problems/predict-the-winner/ 题目描述:给定一个非负的积分数组,玩家1可以从数组两端任取一个积分,接着玩家2执行同样的操作,直至积 ...
- Java入门第39课——猜字母游戏之实现字母生成方法
问题 实现猜字母游戏中的字母生成方法,即,随机生成5个不同的字母作为猜测的结果. 方案 实现generate方法,首先声明一个字符类型的数组,用于存储26个大写字母,然后声 ...
- AutoIt简单使用
以上是自己在公司做培训的PPT首页,其实在线的中文参考文档很全面,很值得学习的.