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,一开始集合是 ...
随机推荐
- 逆波兰法求解数学表达示(C++)
主要是栈的应用,里面有两个函数deleteSpace(),stringToDouble()在我还有一篇博客其中:对string的一些扩展函数. 本程序仅仅是主要的功能实现,没有差错控制. #inclu ...
- 学习笔记——SQL SERVER的递归
SQL SERVER似乎天然具有支持递归的属性. 1.比如说,有几次,我编写或修改存储过程的时候,为图方便,在末尾随手写上 执行这个存储过程 的语句,比如 [sql] view plaincopy A ...
- 邪恶的C++
曾经看到一篇很有趣的文章,今天转载一下.抱歉的是没有找到最原始的版本,算是遗憾吧. ---------- 华丽的分割线 ---------- Linus曾经(2007年9月)在新闻组gmane.com ...
- Genuitec
- Python 30 单例模式
单例模式 多次实例化的结果指向同一个实例 单例模式实现方式 import settings #方式一: class MySQL: __instance=None def __init__(self,i ...
- C - Gravity Flip
Problem description Little Chris is bored during his physics lessons (too easy), so he has built a t ...
- 智能识别快递地址api接口实现(PHP示例)
电商.ERP等行业发货时,批量录入图片上的收件人地址是个难题:智能识别收件人API是近乎完美的解决方案,通过识别图片,解析出图片中收件人的姓名.电话.详细地址(省.市.区/县.详细地址).将此接口集成 ...
- 【Linux】七种文件类型
Linux中的七种文件类型 d 目录文件. l 符号链接(指向另一个文件). s 套接字文件. b 块设备文件,二进制文件. c 字符设备文件. p 命名管道文件. - 普通文件
- SQL Server对数据进行删除
SQL Server对数据进行删除,把页面的信息从数据库删除. auto"> <tr style="background:red"> <td> ...
- 怎么不让别人ping服务器
频繁地使用Ping命令会导致网络堵塞.降低传输效率,为了避免恶意的网络攻击,一般都会拒绝用户Ping服务器.为实现这一目的,不仅可以在防火墙中进 行设置,也可以在路由器上进行设置,并且还可以利用Win ...