思路:边权转化到点权上,统一把每一条边的边权集中到深度较深的点上去。

#include<stdio.h>
#include<iostream>
#include<cstring>
using namespace std;
#define maxn 134567
struct edg
{
int v,to,w,u;
} edge[maxn*2],in[maxn];
int n,q,cnt,sz,fa[maxn],head[maxn],s,ide,data[maxn];
int deep[maxn],siz[maxn],tree[maxn],u,v,w,typ,ans;
int id_data[maxn],tid[maxn],top[maxn],son[maxn];
void add(int u,int v,int w)
{
edge[++ide].v=v;
edge[ide].w=w;
edge[ide].to=head[u];
head[u]=ide;
}
int lowbit(int x)
{
return x&(-x);
}
void updata(int x,int ad)
{
while(x<=n)
{
tree[x]+=ad;
x+=lowbit(x);
}
}
int query(int x)
{
int re=0;
while(x>0)
{
re+=tree[x];
x-=lowbit(x);
}
return re;
}
void dfs1(int u,int pre,int op)
{
son[u]=-1,siz[u]=1;
deep[u]=op,fa[u]=pre;
for(int i=head[u]; i!=-1; i=edge[i].to)
{
int v=edge[i].v;
if(v==pre)continue;
dfs1(v,u,op+1);
data[v]=edge[i].w;
siz[u]+=siz[v];
if(son[v]==-1||siz[son[u]]<siz[v])
son[u]=v;
}
}
void dfs2(int u,int tp)
{
top[u]=tp,tid[u]=++cnt;
id_data[cnt]=data[u];
if(son[u]!=-1)dfs2(son[u],tp);
for(int i=head[u]; i!=-1; i=edge[i].to)
{
int v=edge[i].v;
if(v==fa[u]||v==son[u])continue;
dfs2(v,v);
}
}
void slove(int x,int y)
{
int tx=top[x],ty=top[y];
while(tx!=ty)
{
if(deep[tx]<deep[ty])swap(x,y),swap(tx,ty);
ans+=query(tid[x])-query(tid[tx]-1);
x=fa[tx],tx=top[x];
}
if(deep[x]<deep[y])swap(x,y);
ans+=query(tid[x])-query(tid[y]);
}
int main()
{
memset(head,-1,sizeof(head));
scanf("%d%d%d",&n,&q,&s);
for(int i=1; i<n; i++)
{
scanf("%d%d%d",&u,&v,&w);
in[i].u=u;
in[i].v=v;
in[i].w=w;
add(u,v,w);
add(v,u,w);
}
dfs1(1,0,1);
dfs2(1,1);
for(int i=1; i<=n; i++)
updata(i,id_data[i]);
while(q--)
{
scanf("%d",&typ);
if(typ==0)
{
ans=0;
scanf("%d",&u);
slove(u,s);
printf("%d\n",ans);
s=u;
}
else
{
scanf("%d%d",&u,&v);
if(deep[in[u].u]>deep[in[u].v])
u=in[u].u;
else u=in[u].v;
int xxx=query(tid[u])-query(tid[u]-1);
v-=xxx;
updata(tid[u],v);
}
}
return 0;
}

  

B - Housewife Wind-树链剖分-树状数组的更多相关文章

  1. hdu 3966 Aragorn's Story(树链剖分+树状数组/线段树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3966 题意: 给出一棵树,并给定各个点权的值,然后有3种操作: I C1 C2 K: 把C1与C2的路 ...

  2. Aragorn's Story 树链剖分+线段树 && 树链剖分+树状数组

    Aragorn's Story 来源:http://www.fjutacm.com/Problem.jsp?pid=2710来源:http://acm.hdu.edu.cn/showproblem.p ...

  3. 洛谷 P3384 【模板】树链剖分-树链剖分(点权)(路径节点更新、路径求和、子树节点更新、子树求和)模板-备注结合一下以前写的题目,懒得写很详细的注释

    P3384 [模板]树链剖分 题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节 ...

  4. POJ 2763 Housewife Wind(树链剖分+树状数组)

    [题目链接] http://poj.org/problem?id=2763 [题目大意] 在一棵树上,给出一些边的边长,有修改边的边长的操作, 询问每次从当前点到目标点的最短距离 [题解] 树链剖分之 ...

  5. HDU 3966 Aragorn's Story 树链剖分+树状数组 或 树链剖分+线段树

    HDU 3966 Aragorn's Story 先把树剖成链,然后用树状数组维护: 讲真,研究了好久,还是没明白 树状数组这样实现"区间更新+单点查询"的原理... 神奇... ...

  6. bzoj1146整体二分+树链剖分+树状数组

    其实也没啥好说的 用树状数组可以O(logn)的查询 套一层整体二分就可以做到O(nlngn) 最后用树链剖分让序列上树 #include<cstdio> #include<cstr ...

  7. HDU 5044 (树链剖分+树状数组+点/边改查)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5044 题目大意:修改链上点,修改链上的边.查询所有点,查询所有边. 解题思路: 2014上海网赛的变 ...

  8. hdu 3966 Aragorn&#39;s Story(树链剖分+树状数组)

    pid=3966" target="_blank" style="">题目链接:hdu 3966 Aragorn's Story 题目大意:给定 ...

  9. (简单) POJ 3321 Apple Tree,树链剖分+树状数组。

    Description There is an apple tree outside of kaka's house. Every autumn, a lot of apples will grow ...

  10. Codeforces Round #425 (Div. 2) Problem D Misha, Grisha and Underground (Codeforces 832D) - 树链剖分 - 树状数组

    Misha and Grisha are funny boys, so they like to use new underground. The underground has n stations ...

随机推荐

  1. Ubuntu 服务器上面--安装和配置mysql 【转】

    更新源列表 打开"终端窗口",输入"sudo apt-get update"-->回车-->"输入root用户的密码"--> ...

  2. Ubuntu16.04 安装g++6

    https://blog.csdn.net/qq_34877350/article/details/81182022 1.安装gcc-6: sudo apt-get update && ...

  3. 金融量化分析【day111】:Pandas-时间序列处理

    一.时间对象处理 1.start 开始时间 df["2018-12-01":"2018-12-30"] 2.end 结束时间 df['2018'] ...... ...

  4. 如何巧妙的使用ArrayList的Clone方法

    一.ArrayList的Clone方法的源码 返回一个Object对象,所以在使用此方法的时候要强制转换. ArrayList的本质是维护了一个Object的数组,所以克隆也是通过数组的复制实现的,属 ...

  5. [再寄小读者之数学篇](2014-06-22 发散级数 [中国科学技术大学2012年高等数学B考研试题])

    设 $a_n>0$, $S_n=a_1+a_2+\cdots+a_n$, 级数 $\dps{\vsm{n}a_n}$ 发散, 证明: $\dps{\vsm{n}\cfrac{a_n}{S_n}} ...

  6. Java同步容器

    一.为什么会出现同步容器 Java的集合框架中,主要有四大类别:List,Set,Queue,Map List,Set,Queue接口分别继承了Collection接口,Map本身是一个接口. 注意C ...

  7. mysql 分库分表 ~ 柔性事务

    一 定义 TCC方案是可能是目前最火的一种柔性事务方案二 具体 内容 TCC=try(预设)-confrim(应用确认)-canal(回滚取消)三 目的 解决跨服务调用场景下的分布式事务问题,避免使用 ...

  8. xls添加 序号列技巧

    问题背景:在给xls添加一列序列时常碰到一个问题,用下拉很不科学(如果行数很多):用双击需要右边有一列不断开的数据列. 方法一:在A1 =row()回车,选择范围,快捷键 ctrl+d,   复制其文 ...

  9. conda安装cv2库

    conda install opencv-python或者 pip install opencv-python(不过好像是这个比较有效)

  10. MySQL平滑删除数据的小技巧【转】

    今天接到一位开发同学的数据操作需求,需求看似很简单,需要执行下面的SQL语句: delete from test_track_log where log_time < '2019-1-7 00: ...