URAL 1553. Caves and Tunnels 树链拆分
一颗树 每次出发点右键值是0
2操作模式1.第一i右键点值添加x 2.乞讨u至v在这条路上右上方值
树为主的连锁分裂称号
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 100010;
struct edge
{
int v, next;
}e[maxn*2];
int first[maxn], cnt; void AddEdge(int u, int v)
{
e[cnt].v = v;
e[cnt].next = first[u];
first[u] = cnt++;
e[cnt].v = u;
e[cnt].next = first[v];
first[v] = cnt++;
} int top[maxn], sz[maxn], son[maxn], f[maxn], dep[maxn];
int n, id[maxn], rank[maxn], tid;
void init()
{
memset(first, -1, sizeof(first));
cnt = 0;
memset(son, -1, sizeof(son));
tid = 0;
} void dfs1(int u, int fa, int d)
{
sz[u] = 1;
f[u] = fa;
dep[u] = d;
for(int i = first[u]; i != -1; i = e[i].next)
{
int v = e[i].v;
if(v == fa)
continue;
dfs1(v, u, d+1);
sz[u] += sz[v];
if(son[u] == -1 || sz[son[u]] < sz[v])
son[u] = v;
}
} void dfs2(int u, int tp)
{
top[u] = tp;
id[u] = ++tid;
rank[tid] = u;
if(son[u] == -1)
return;
dfs2(son[u], tp);
for(int i = first[u]; i != -1; i = e[i].next)
{
int v = e[i].v;
if(v != f[u] && son[u] != v)
dfs2(v, v);
}
}
int a[maxn<<2]; void pushup(int rt)
{
a[rt] = max(a[rt<<1], a[rt<<1|1]);
}
void build(int l, int r, int rt)
{
a[rt] = 0;
if(l == r)
return;
int m = (l + r) >> 1;
build(l, m, rt<<1);
build(m+1, r, rt<<1|1);
} int query(int x, int y, int l, int r, int rt)
{
if(x == l && y == r)
{
return a[rt];
}
int m = (l + r) >> 1;
if(y <= m)
return query(x, y, l, m, rt<<1);
else if(x > m)
return query(x, y, m+1, r, rt<<1|1);
else
{
return max(query(x, m, l, m, rt<<1), query(m+1, y, m+1, r, rt<<1|1));
}
} void update(int x, int l, int r, int rt, int d)
{
if(l == r)
{
a[rt] += d;
return;
} int m = (l + r) >> 1;
if(x <= m)
update(x, l, m, rt<<1, d);
else
update(x, m+1, r, rt<<1|1, d);
pushup(rt);
} int change(int u, int v)
{
int ans = 0;
while(top[u] != top[v])
{
if(dep[top[u]] < dep[top[v]])
swap(u, v);
ans = max(ans, query(id[top[u]], id[u], 1, n, 1));
u = f[top[u]];
}
if(dep[u] > dep[v])
swap(u, v);
ans = max(ans, query(id[u], id[v], 1, n, 1));
return ans;
}
int main()
{
while(scanf("%d", &n) != EOF)
{
init();
for(int i = 1; i < n; i++)
{
int u, v;
scanf("%d %d", &u, &v);
AddEdge(u, v);
}
dfs1(1, 0, 0);
dfs2(1, 1);
build(1, n, 1);
int q;
scanf("%d", &q); while(q--)
{
char s[10];
int u, v;
scanf("%s %d %d", s, &u, &v);
if(s[0] == 'G')
{
printf("%d\n", change(u, v));
}
else
{
update(id[u], 1, n, 1, v);
}
}
}
return 0;
}
版权声明:本文博客原创文章。博客,未经同意,不得转载。
URAL 1553. Caves and Tunnels 树链拆分的更多相关文章
- URAL1553 Caves and Tunnels 树链剖分 动态树
URAL1553 维护一棵树,随时修改某个节点的权值,询问(x,y)路径上权值最大的点. 树是静态的,不过套动态树也能过,时限卡的严就得上树链剖分了. 还是那句话 splay的核心是splay(x) ...
- URAL 题目1553. Caves and Tunnels(Link Cut Tree 改动点权,求两点之间最大)
1553. Caves and Tunnels Time limit: 3.0 second Memory limit: 64 MB After landing on Mars surface, sc ...
- hdu5044 Tree 树链拆分,点细分,刚,非递归版本
hdu5044 Tree 树链拆分.点细分.刚,非递归版本 //#pragma warning (disable: 4786) //#pragma comment (linker, "/ST ...
- Codeforces 191C Fools and Roads(树链拆分)
题目链接:Codeforces 191C Fools and Roads 题目大意:给定一个N节点的数.然后有M次操作,每次从u移动到v.问说每条边被移动过的次数. 解题思路:树链剖分维护边,用一个数 ...
- Codeforces 191 C Fools and Roads (树链拆分)
主题链接~~> 做题情绪:做了HDU 5044后就感觉非常easy了. 解题思路: 先树链剖分一下,把树剖分成链,由于最后全是询问,so~能够线性操作.经过树链剖分后,就会形成很多链,可是每条边 ...
- HYSBZ 2243 染色 (树链拆分)
主题链接~~> 做题情绪:这题思路好想.调试代码调试了好久.第一次写线段树区间合并. 解题思路: 树链剖分 + 线段树区间合并 线段树的端点记录左右区间的颜色.颜色数目.合并的时候就用区间合并的 ...
- poj 3237 Tree(树链拆分)
题目链接:poj 3237 Tree 题目大意:给定一棵树,三种操作: CHANGE i v:将i节点权值变为v NEGATE a b:将ab路径上全部节点的权值变为相反数 QUERY a b:查询a ...
- hdu 4912 Paths on the tree(树链拆分+贪婪)
题目链接:hdu 4912 Paths on the tree 题目大意:给定一棵树,和若干个通道.要求尽量选出多的通道,而且两两通道不想交. 解题思路:用树链剖分求LCA,然后依据通道两端节点的LC ...
- BZOJ 3589 动态树 树链拆分+纳入和排除定理
标题效果:鉴于一棵树.每个节点有一个右值,所有节点正确启动值他们是0.有两种操作模式,0 x y代表x右所有点的子树的根值添加y. 1 k a1 b1 a2 b2 --ak bk代表质疑. 共同拥有者 ...
随机推荐
- python socket编程实现的简单tcp迭代server
与c/c++ socket编程对照见http://blog.csdn.net/aspnet_lyc/article/details/38946915 server: import socket POR ...
- 让window命令行支持自己主动补全[相似Linux的Tab键]
打开注冊表,找到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor下 项"CompletionChar"(REG_DWO ...
- SAE开发一个应用(不仅仅是建站)
参考http://jingyan.baidu.com/user/npublic/?un=944615045 http://sae.sina.com.cn/ 激活sae账户 登陆新浪云计算官方网站,网址 ...
- SWT的CheckBoxTreeView的上级菜单与下级菜单的选中的实现
是不是很神奇? treeViewer.addCheckStateListener(new ICheckStateListener() { @Override public void checkStat ...
- U10vim程序编辑器
vim需要多加练习. 1.你可以将vim视为vi的高级版本.vi分成三种模式:一般模式,编辑模式和命令行模式. 一般模式:以vi打开一个文件就直接进入一般模式了(这也是默认的模式).在这个模式中,你可 ...
- U9文件与文件系统的压缩和打包
1.在Linux的环境中,压缩文件的扩展名大多为:*.tar,*.tar.gz,*.tgz,*.bz2. 2.gzip可以说是应用最广的压缩命令了.目前gzip可以揭开compress,zip和gzi ...
- The Building Blocks-Enterprise Applications Part 2- Information Management and Business Analytics
1. Business Analytic Applications Data Analytics Also referred to as 'Business Analytics' or 'Busine ...
- Java Executor 框架
Java Executor 框架 Executor框架是指java5中引入的一系列并发库中与executor相关的功能类,包括Executor.Executors. ExecutorService.C ...
- Hibernate4 : 持久化你的第一个类
由于目前我在学校的一个实验室跟老师学习Java EE开发,老师用的是Seam框架接活做项目,所以这一系列的文章将会向Seam方向写..路线大致应该是 : JSP --> Servlet --&g ...
- 使用scipy进行聚类
近期做图像的时候,突然有个idea,须要进行聚类,事实上算法非常easy,可是当时非常急.就直接使用了scipy的cluster. 使用起来事实上非常easy,可是中文的文章非常少,所以就简单的介绍一 ...