算是模板题了

可以用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. Hilbert曲线简单介绍及生成算法

    Hilbert曲线 Hilbert曲线是一种填充曲线,相似的填充曲线还包含Z曲线.格雷码等其它方法.Hilbert曲线根据自身空间填充曲线的特性,能够线性地贯穿二维或者更高维度每一个离散单元.而且只穿 ...

  2. python 004 执行环境对比

    对比:os.system os.popen subprocess.Popen subprocess.call 为什么要搞这么多? # --*--encoding: utf-8--*-- import ...

  3. vijos P1459车展

    P1459车展 Accepted 标签:数据结构 平衡树数据结构 堆重游SC theme Park     描述 遥控车是在是太漂亮了,韵韵的好朋友都想来参观,所以游乐园决定举办m次车展.车库里共有n ...

  4. luogu3157 动态逆序对

    题目大意 给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计整个序列的逆序对数. 思路 #include <cstdio> #include <c ...

  5. MTK camera 闪光灯Flashlight驱动调试流程

    MTK camera 闪光灯Flashlight驱动调试流程 分类: MtkDev  |  作者: topicdev 相关  |  发布日期 : 2014-09-26  |  热度 : 153°   ...

  6. Appium + python - get_attribute获取value操作

    from appium import webdriverfrom selenium.webdriver.support.wait import WebDriverWaitfrom selenium.w ...

  7. go函数初级

    一.简介 在go语言中,函数的功能是非常强大的,以至于被认为拥有函数式编程语言的多种特性. 二.介绍 1.一个程序中包含了很多的函数:函数式基本的代码块 2.函数编写的顺序是无关紧要的:鉴于可读性的需 ...

  8. SQL连接其它服务器操作

    Exec sp_droplinkedsrvlogin ZYB,Null --删除映射(录与链接服务器上远程登录之间的映射) Exec sp_dropserver ZYB --删除远程服务器链接 EXE ...

  9. 在使用实体框架(Entity Framework)的应用中加入审计信息(Audit trail)跟踪数据的变动

    在一些比较重要的业务系统中,通常会要求系统跟踪数据记录的变动情况.系统要记录什么时间,什么人,对那些信息进行了变动. 比较简单的实现方式是在每个表中加入两个字段CreatedBy和CreatedAt, ...

  10. Android TV 选中高亮显示

    1.开发Android TV APP, 使用遥控器选中按钮或者选着其它菜单 如果没有高亮显示,就看不出选中哪个按钮或者菜单 2.在drawable 添加 border_red.xml 设置选中高亮 & ...