一颗树 每次出发点右键值是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 树链拆分的更多相关文章

  1. URAL1553 Caves and Tunnels 树链剖分 动态树

    URAL1553 维护一棵树,随时修改某个节点的权值,询问(x,y)路径上权值最大的点. 树是静态的,不过套动态树也能过,时限卡的严就得上树链剖分了. 还是那句话 splay的核心是splay(x) ...

  2. 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 ...

  3. hdu5044 Tree 树链拆分,点细分,刚,非递归版本

    hdu5044 Tree 树链拆分.点细分.刚,非递归版本 //#pragma warning (disable: 4786) //#pragma comment (linker, "/ST ...

  4. Codeforces 191C Fools and Roads(树链拆分)

    题目链接:Codeforces 191C Fools and Roads 题目大意:给定一个N节点的数.然后有M次操作,每次从u移动到v.问说每条边被移动过的次数. 解题思路:树链剖分维护边,用一个数 ...

  5. Codeforces 191 C Fools and Roads (树链拆分)

    主题链接~~> 做题情绪:做了HDU 5044后就感觉非常easy了. 解题思路: 先树链剖分一下,把树剖分成链,由于最后全是询问,so~能够线性操作.经过树链剖分后,就会形成很多链,可是每条边 ...

  6. HYSBZ 2243 染色 (树链拆分)

    主题链接~~> 做题情绪:这题思路好想.调试代码调试了好久.第一次写线段树区间合并. 解题思路: 树链剖分 + 线段树区间合并 线段树的端点记录左右区间的颜色.颜色数目.合并的时候就用区间合并的 ...

  7. poj 3237 Tree(树链拆分)

    题目链接:poj 3237 Tree 题目大意:给定一棵树,三种操作: CHANGE i v:将i节点权值变为v NEGATE a b:将ab路径上全部节点的权值变为相反数 QUERY a b:查询a ...

  8. hdu 4912 Paths on the tree(树链拆分+贪婪)

    题目链接:hdu 4912 Paths on the tree 题目大意:给定一棵树,和若干个通道.要求尽量选出多的通道,而且两两通道不想交. 解题思路:用树链剖分求LCA,然后依据通道两端节点的LC ...

  9. BZOJ 3589 动态树 树链拆分+纳入和排除定理

    标题效果:鉴于一棵树.每个节点有一个右值,所有节点正确启动值他们是0.有两种操作模式,0 x y代表x右所有点的子树的根值添加y. 1 k a1 b1 a2 b2 --ak bk代表质疑. 共同拥有者 ...

随机推荐

  1. nginx fastcgi 自定义错误页面

    http{ fastcgi_intercept_errors on; error_page 404 /404.html; } fastcgi_intercept_errors on;必须设置 之后通过 ...

  2. android视频库Vitamio

    之前尝试自己解码视频,然后播放显示,虽然音视频都可以播放,但是实现不了音视频的同步,所以使用第三方的视频库Vitamio来实现视频播放器功能,这样自己只需要实现播放解码的制作不不要关心底层解码和显示问 ...

  3. Java正則表達式演示样例

    import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexMatches { public s ...

  4. Java自学资料——线程

    [转]传智播客成都java培训中心学员笔记. 线程: static int MAX_PRIORITY 线程能够具有的最高优先级. static int MIN_PRIORITY 线程能够具有的最低优先 ...

  5. 解决方式:QSqlDatabase: an instance of QCoreApplication is required for loading driver plugins

    在用QSqlDatabase时遇到报错QSqlDatabase: an instance of QCoreApplication is required for loading driver plug ...

  6. Failed to load libGL.so问题解决

    Ubuntu 14.04下启动模拟设备Android 4.2.2的时候报错: failed to load libgl.so 先用locate 命令定位libGL库, 然后加入�一个链接就可以: de ...

  7. BC 2015在百度之星程序设计大赛 - 预赛(1)(KPI-树董事长)

    KPI Accepts: 517 Submissions: 2185 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 ...

  8. 用XAML做网页!!—广告展示区

    原文:用XAML做网页!!-广告展示区 此次我们来进行广告展示区块的制作. 首先在Show区块中去掉原来设置的背景色,加入新的渐变背景设定: <Grid.Background> <L ...

  9. Oracle中decode函数 列变成行

    create table t_class(c_Id  number(10) primary key ,stuName varchar2(50),  --人名c_Name varchar2(50),   ...

  10. C 一个字符串有三段,第一段原样输出,第二段为要输出字符串的长度,第三段为依据第二段长度补齐第一段

    C 一个字符串有三段,第一段原样输出.第二段为要输出字符串的长度,第三段为依据第二段长度补齐第一段 比如:输入abc 11 12.输出abc12121212 #include<stdio.h&g ...