算是模板题了

可以用dfs序维护点到根的距离

注意些LCA的时候遇到MAXM,要-1

#include<cstdio>
#include<algorithm>
#include<cstring>
#define REP(i, a, b) for(register int i = (a); i < (b); i++)
#define _for(i, a, b) for(register int i = (a); i <= (b); i++)
using namespace std; const int MAXN = 1e5 + ;
const int MAXM = ;
struct Edge{ int to, next, w; } e[MAXN << ];
int head[MAXN], tot; int U[MAXN], V[MAXN], W[MAXN], d[MAXN];
int L[MAXN], R[MAXN], f[MAXN], cnt;
int up[MAXN][MAXM+], n, s, q; void AddEdge(int from, int to, int w)
{
e[tot] = Edge{to, head[from], w};
head[from] = tot++;
} inline int lowbit(int x) { return x & (-x); } void add(int x, int p)
{
for(; x <= n; x += lowbit(x))
f[x] += p;
} int sum(int x)
{
int res = ;
for(; x; x -= lowbit(x))
res += f[x];
return res;
} inline void modify(int u, int w)
{
add(L[u], w); add(R[u] + , -w);
} void dfs(int u, int fa, int op)
{
if(!op) L[u] = ++cnt;
for(int i = head[u]; ~i; i = e[i].next)
{
int v = e[i].to;
if(v == fa) continue;
if(!op)
{
up[v][] = u;
d[v] = d[u] + ;
}
if(op) modify(v, e[i].w);
dfs(v, u, op);
}
if(!op) R[u] = cnt;
} void init()
{
up[][] = ;
REP(j, , MAXM)
_for(i, , n)
up[i][j] = up[up[i][j-]][j-];
} int lca(int u, int v)
{
if(d[u] < d[v]) swap(u, v);
for(int j = MAXM - ; j >= ; j--)
if(d[up[u][j]] >= d[v])
u = up[u][j];
if(u == v) return u;
for(int j = MAXM - ; j >= ; j--)
if(up[u][j] != up[v][j])
u = up[u][j], v = up[v][j];
return up[u][];
} inline int dis(int u, int v)
{
return sum(L[u]) + sum(L[v]) - * sum(L[lca(u, v)]);
} int main()
{
while(~scanf("%d%d%d", &n, &q, &s))
{
memset(head, -, sizeof(head));
memset(f, , sizeof(f));
tot = cnt = ; REP(i, , n)
{
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
U[i] = u; V[i] = v; W[i] = w;
AddEdge(u, v, w); AddEdge(v, u, w);
} dfs(, -, );
dfs(, -, );
init(); while(q--)
{
int op, x, y;
scanf("%d", &op);
if(op == )
{
scanf("%d", &x);
printf("%d\n", dis(x, s));
s = x;
}
else
{
scanf("%d%d", &x, &y);
int u = U[x], v = V[x], w = W[x];
if(up[u][] == v) swap(u, v);
modify(v, y - w);
W[x] = y;
}
}
} return ;
}

poj 2763(LCA + dfs序 +树状数组)的更多相关文章

  1. 【BZOJ】2819: Nim(树链剖分 / lca+dfs序+树状数组)

    题目 传送门:QWQ 分析 先敲了个树链剖分,发现无法AC(其实是自己弱,懒得debug.手写栈) 然后去学了学正解 核心挺好理解的,$ query(a) $是$ a $到根的异或和. 答案就是$ l ...

  2. 【bzoj1146】[CTSC2008]网络管理Network 倍增LCA+dfs序+树状数组+主席树

    题目描述 M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个部门之间协同工作,公司搭建了一个连接整个公司的通信网络.该网络的结构由N个路由器和N-1条高 ...

  3. Codeforces Gym 101142 G Gangsters in Central City (lca+dfs序+树状数组+set)

    题意: 树的根节点为水源,编号为 1 .给定编号为 2, 3, 4, …, n 的点的父节点.已知只有叶子节点都是房子. 有 q 个操作,每个操作可以是下列两者之一: + v ,表示编号为 v 的房子 ...

  4. HDU 5293 Tree chain problem 树形dp+dfs序+树状数组+LCA

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5293 题意: 给你一些链,每条链都有自己的价值,求不相交不重合的链能够组成的最大价值. 题解: 树形 ...

  5. HDU 5293 Annoying problem 树形dp dfs序 树状数组 lca

    Annoying problem 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5293 Description Coco has a tree, w ...

  6. 【bzoj2819】Nim DFS序+树状数组+倍增LCA

    题目描述 著名游戏设计师vfleaking,最近迷上了Nim.普通的Nim游戏为:两个人进行游戏,N堆石子,每回合可以取其中某一堆的任意多个,可以取完,但不可以不取.谁不能取谁输.这个游戏是有必胜策略 ...

  7. POJ 3321:Apple Tree + HDU 3887:Counting Offspring(DFS序+树状数组)

    http://poj.org/problem?id=3321 http://acm.hdu.edu.cn/showproblem.php?pid=3887 POJ 3321: 题意:给出一棵根节点为1 ...

  8. 【bzoj3881】[Coci2015]Divljak AC自动机+树链的并+DFS序+树状数组

    题目描述 Alice有n个字符串S_1,S_2...S_n,Bob有一个字符串集合T,一开始集合是空的. 接下来会发生q个操作,操作有两种形式: “1 P”,Bob往自己的集合里添加了一个字符串P. ...

  9. BZOJ_3881_[Coci2015]Divljak_AC自动机+dfs序+树状数组

    BZOJ_3881_[Coci2015]Divljak_AC自动机+dfs序+树状数组 Description Alice有n个字符串S_1,S_2...S_n,Bob有一个字符串集合T,一开始集合是 ...

随机推荐

  1. rsync + inotify 打造多server间文件实时同步

    在上篇文章ssh无password登陆server的基础之上.能够利用rsync + Inotify 在多server间实现文件自己主动同步. 例如以下測试机基于三台server做的.内网IP分别例如 ...

  2. DotNetBar.Bar作为容器使用的方法及Text更新原理

    DotNetBar.Bar作为容器使用的方法及Text更新原理                          老帅    一.容器用法   控件DevComponents.DotNetBar.Ba ...

  3. js面试题--------JS中数字和字符,布尔类型相加相减问题

    JS中数字和字符相加相减问题 <html lang="en"> <head> <meta charset="utf-8" /> ...

  4. mysql 修改和删除 权限设置

    SET SQL_SAFE_UPDATES = 0; update和delete操作将会顺利执行 SET SQL_SAFE_UPDATES = 1; (安全更新模式(safe update mode)) ...

  5. mysql中DATETIME类型与TIMESTAMP的区别

    1.DATETIME的日期范围是1001--9999年,TIMESTAMP的时间范围是1970--2038年. 2.DATETIME存储时间与时区无关,TIMESTAMP存储时间与时区有关,显示的值也 ...

  6. ES transport client批量导入

    从bulk.txt文件中按行读取,然后bulk导入.首先通过调用client.prepareBulk()实例化一个BulkRequestBuilder对象,调用BulkRequestBuilder对象 ...

  7. codevs1358棋盘游戏(状压dp)

    1358 棋盘游戏  时间限制: 1 s  空间限制: 64000 KB  题目等级 : 大师 Master     题目描述 Description 这个游戏在一个有10*10个格子的棋盘上进行,初 ...

  8. Elasticsearch 7.1.1 集群 + 配置身份验证

    一.安装Elasticsearch 1.1 环境说明 Centos7.6 Elasticsearch7.1.1 #挂载数据盘 fdisk /dev/vdb n,p,,回车,回车,wq fdisk -l ...

  9. 使用ZeppelinHub来存储和展示ZeppelinNoteBook

    0.序 说实在的这个功能太赞了 在一开始接触的时候不知道有这个功能,我尝试做一下配置,发现非常的棒. 棒的原因有两点: 可以在随时随地有互联网的地方访问自己的ZeppelinHub来查看Zeppeli ...

  10. html5与css3入门知识点精炼

    <meta name = "keywords" content="…………"/>(网页搜索时要输入的关键字) <meta name = &qu ...