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

#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. 帝国cms 不能正常显示最新文章

    后台能正常刷新,但前台就是不能正常显示, 把网站从c盘换到d盘,好了,原来是权限的问题

  2. CMDB服务器管理系统【s5day88】:采集资产-文件配置(二)

    上节疑问: 1.老师我们已经写到global_settings里了,为什么还要写到__init__.py setting 这的作用是为了:整合起两个的组合global_settings和setting ...

  3. 安装mysql和xampp遇到问题

    1.mysql的期望地址和配置的地址不一致: 解决方法:修改注册表 在附件命令提示符输入regedit 找[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Se ...

  4. mongodb3.6集群搭建:分片+副本集

    mongodb是最常用的noSql数据库,在数据库排名中已经上升到了前五.这篇文章介绍如何搭建高可用的mongodb(分片+副本)集群. 在搭建集群之前,需要首先了解几个概念:路由,分片.副本集.配置 ...

  5. 第六节:深入研究Task实例方法ContinueWith的参数TaskContinuationOptions

    一. 整体说明 揭秘: 该章节的性质和上一个章节类似,也是一个扩展的章节,主要来研究Task类下的实例方法ContinueWith中的参数TaskContinuationOptions. 通过F12查 ...

  6. JavaScript 函数递归

    递归函数 递归函数是在一个函数通过名字调用自身的情况下构成的 项目中例如树状结构渲染,对象深复制,等很多方面都会使用到递归函数 function factorial(num){ if (num < ...

  7. end to end testing

    概念 https://www.softwaretestinghelp.com/what-is-end-to-end-testing/ What is “End to End Testing”? Ter ...

  8. Hibernate 4.3.11 下问题的解决

    2017.01.09 问题:hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hib ...

  9. 常见的cmake工程做法

    第一步,创建一个build目录存放cmake生成的中间文件: mkdir build 第二步,进入到build文件目录: cd build 第三步,cmake把代码文件生成一个makefile文件: ...

  10. Django之Model

    一.字段 常用字段: AutoField:int自增列,必须填入参数 primary_key=True.当model中如果没有自增列,则自动会创建一个列名为id的列. IntergerField:一个 ...