poj 2763(LCA + dfs序 +树状数组)
算是模板题了
可以用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序 +树状数组)的更多相关文章
- 【BZOJ】2819: Nim(树链剖分 / lca+dfs序+树状数组)
题目 传送门:QWQ 分析 先敲了个树链剖分,发现无法AC(其实是自己弱,懒得debug.手写栈) 然后去学了学正解 核心挺好理解的,$ query(a) $是$ a $到根的异或和. 答案就是$ l ...
- 【bzoj1146】[CTSC2008]网络管理Network 倍增LCA+dfs序+树状数组+主席树
题目描述 M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个部门之间协同工作,公司搭建了一个连接整个公司的通信网络.该网络的结构由N个路由器和N-1条高 ...
- Codeforces Gym 101142 G Gangsters in Central City (lca+dfs序+树状数组+set)
题意: 树的根节点为水源,编号为 1 .给定编号为 2, 3, 4, …, n 的点的父节点.已知只有叶子节点都是房子. 有 q 个操作,每个操作可以是下列两者之一: + v ,表示编号为 v 的房子 ...
- HDU 5293 Tree chain problem 树形dp+dfs序+树状数组+LCA
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5293 题意: 给你一些链,每条链都有自己的价值,求不相交不重合的链能够组成的最大价值. 题解: 树形 ...
- HDU 5293 Annoying problem 树形dp dfs序 树状数组 lca
Annoying problem 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5293 Description Coco has a tree, w ...
- 【bzoj2819】Nim DFS序+树状数组+倍增LCA
题目描述 著名游戏设计师vfleaking,最近迷上了Nim.普通的Nim游戏为:两个人进行游戏,N堆石子,每回合可以取其中某一堆的任意多个,可以取完,但不可以不取.谁不能取谁输.这个游戏是有必胜策略 ...
- 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 ...
- 【bzoj3881】[Coci2015]Divljak AC自动机+树链的并+DFS序+树状数组
题目描述 Alice有n个字符串S_1,S_2...S_n,Bob有一个字符串集合T,一开始集合是空的. 接下来会发生q个操作,操作有两种形式: “1 P”,Bob往自己的集合里添加了一个字符串P. ...
- BZOJ_3881_[Coci2015]Divljak_AC自动机+dfs序+树状数组
BZOJ_3881_[Coci2015]Divljak_AC自动机+dfs序+树状数组 Description Alice有n个字符串S_1,S_2...S_n,Bob有一个字符串集合T,一开始集合是 ...
随机推荐
- rnnlm源代码分析(八)
系列前言 參考文献: RNNLM - Recurrent Neural Network Language Modeling Toolkit(点此阅读) Recurrent neural networ ...
- 您必须先调用“WebSecurity.InitializeDatabaseConnection”方法。。。
有如下代码: [Authorize] public ActionResult Index() { ViewBag.ShowList = ShowList.GetShowList(WebSecurity ...
- android recovery 主系统代码分析【转】
本文转载自:http://blog.csdn.net/andyhuabing/article/details/9248713 阅读完上一篇文章: http://blog.csdn.net/andyhu ...
- Android和H5交互-基础篇
hybrid App开发也不是什么新鲜事了,其中native和h5之间的交互则是必不可少的.Android中是如何和H5交互的? 1.webView加载页面 我们都知道在Android中是通过webV ...
- Springboot+hibernate简单的增删改查
1.创建好项目之后在配置端口号(也可以不用配置,默认端口8080) #server server.port= server.tomcat.uri-encoding=utf- 2.配置mysql #My ...
- 强迫症!一行代码拿到url特定query的值
简单的说一下背景,看到小伙伴给我发的项目中有一段获取当前url特定query值的代码,本着能写1行代码就不写5行代码的原则,我把这个获取方法给改了一下 之前的代码如下: const queryArr ...
- Lambda&Linq
var list = new List<Model> { , UserName = ", Email = "zhang3@yoy.com"}, , UserN ...
- Java中的synchronized
学习 https://blog.csdn.net/a158123/article/details/78607964 以及 https://www.cnblogs.com/beiyetengqing/p ...
- JSON与List之间的转换
jsonString转换为list: JSONArray jsonArray=JSONArray.fromObject(result); List<RentCar> books=(List ...
- 运用<body>属性,渲染页面效果
新建一个HTML5文件,为<body>标签添加样式,代码如下: 01 <!doctype html> 02 <html> 03 <head> 04 &l ...