Problem 2082 过路费

Problem Description

有n座城市,由n-1条路相连通,使得任意两座城市之间可达。每条路有过路费,要交过路费才能通过。每条路的过路费经常会更新,现问你,当前情况下,从城市a到城市b最少要花多少过路费。

Input

有多组样例,每组样例第一行输入两个正整数n,m(2 <= n<=50000,1<=m <= 50000),接下来n-1行,每行3个正整数a b c,(1 <= a,b <= n , a != b , 1 <= c <= 1000000000).数据保证给的路使得任意两座城市互相可达。接下来输入m行,表示m个操作,操作有两种:一. 0 a b,表示更新第a条路的过路费为b,1 <= a <= n-1 ; 二. 1 a b , 表示询问a到b最少要花多少过路费。

Output

对于每个询问,输出一行,表示最少要花的过路费。

 Sample Input

2 3
1 2 1
1 1 2
0 1 2
1 2 1

 Sample Output

1 2
 #include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn = ;
int son[maxn]; //表示该点重链的子节点
int num[maxn]; //表示以该点为根的子树的节点数量
int dep[maxn]; //表示该节点的深度
int fa[maxn]; // 表示该节点的父亲节点
int vis[maxn]; // 表示该节点在线段树中的编号
int top[maxn]; // 表示这条重链的顶端节点
int is[maxn];
int edge[maxn][];
int now;
struct Tree
{
int l;
int r;
int Sum;
} tree[maxn*];
struct node
{
int to,val;
} p;
vector<node>E[maxn];
void init()
{
now=;
memset(is,,sizeof(is));
memset(son,-,sizeof(son));
memset(tree,,sizeof(tree));
for(int i=; i<maxn; i++)
E[i].clear();
}
void dfs1(int u,int v,int step) //第一遍dfs求出son,fa,num,dep
{
is[v]=;
dep[v]=step;
num[v]=;
fa[v]=u;
int len = E[v].size();
for(int i=; i<len; i++)
{
int to = E[v][i].to;
if(!is[to])
{
dfs1(v,to,step+);
num[v]+=num[to];
if(son[v]==-||num[son[v]]<num[to])
{
son[v]=to;
}
}
}
return ;
}
void dfs2(int u,int v) // 第二遍dfs求出top和vis
{
is[v]=;
top[v]=u;
vis[v]=now++;
if(son[v]==-)
return ;
else
dfs2(u,son[v]);
int len = E[v].size();
for(int i=; i<len; i++)
{
int to = E[v][i].to;
if(!is[to])
{
if(to==fa[v]||to==son[v])
continue;
dfs2(to,to);
}
}
}
void build(int v,int l,int r)
{
tree[v].l=l;
tree[v].r=r;
if( l == r )
{
tree[v].Sum=;
return;
}
int mid=( l+r )>>;
build( v<<,l,mid );
build( v<<|,mid+,r );
tree[v].Sum=;
}
int query( int v,int l,int r)
{
if (l==tree[v].l&&r==tree[v].r)
return tree[v].Sum;
int mid=(tree[v].l+tree[v].r)>>;
if(l <= mid && r <= mid)
return query(v<<,l,r);
else if(l > mid)
return query(v<<|,l,r);
else
return query(v<<,l,mid)+query(v<<|,mid+,r);
}
void update(int v,int x,int m)
{
int l,r;
l = tree[v].l;
r = tree[v].r;
int mid = (l + r) / ;
if(l == r)
{
tree[v].Sum = m;
return;
}
if(x <= mid)
update(v<<,x,m);
else
update(v<<|,x,m);
tree[v].Sum=query(v<<,l,mid)+query(v<<|,mid+,r);
}
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
init();
for(int i=; i<=n-; i++)
{
scanf("%d%d%d",&edge[i][],&edge[i][],&edge[i][]);
p.to=edge[i][],p.val=edge[i][];
E[edge[i][]].push_back(p);
p.to=edge[i][],p.val=edge[i][];
E[edge[i][]].push_back(p);
}
dfs1(,,);
memset(is,,sizeof(is));
dfs2(,);
build(,,n);
for(int i = ; i <= n-; i++)
{
if(dep[edge[i][]] < dep[edge[i][]])
swap(edge[i][],edge[i][]);
update(,vis[edge[i][]]+,edge[i][]);
}
while(m--)
{
int x,y,z,q,w;
scanf("%d%d%d",&x,&y,&z);
if(x)
{
q = top[y],w = top[z];
int ans = ;
while(q != w) //不在一条重链上,就爬树
{
if(dep[q] < dep[w])
{
swap(q,w);
swap(y,z);
}
ans += query(,vis[q]+,vis[y]+);
y = fa[q];
q = top[y];
}
if(y != z) //爬到一条重链上
{
if(dep[y] > dep[z])
swap(y,z);
ans += query(,vis[son[y]]+,vis[z]+);
}
printf("%d\n",ans);
}
else
{
update(,vis[edge[y][]]+,z);
}
} }
return ;
}

FZU oj Problem 2082 过路费的更多相关文章

  1. Fzu Problem 2082 过路费 LCT,动态树

    题目:http://acm.fzu.edu.cn/problem.php?pid=2082 Problem 2082 过路费 Accept: 528    Submit: 1654Time Limit ...

  2. FZU Problem 2082 过路费 树链剖分

    Problem 2082 过路费    Problem Description 有n座城市,由n-1条路相连通,使得任意两座城市之间可达.每条路有过路费,要交过路费才能通过.每条路的过路费经常会更新, ...

  3. FZU Problem 2082 过路费

    Problem 2082 过路费 Accept: 875    Submit: 2839Time Limit: 1000 mSec    Memory Limit : 32768 KB Problem ...

  4. FOJ题目Problem 2082 过路费 (link cut tree边权更新)

    Problem 2082 过路费 Accept: 382    Submit: 1279 Time Limit: 1000 mSec    Memory Limit : 32768 KB Proble ...

  5. fzu 2082 过路费 (树链剖分+线段树 边权)

    Problem 2082 过路费 Accept: 887    Submit: 2881Time Limit: 1000 mSec    Memory Limit : 32768 KB  Proble ...

  6. FZU 2082 过路费(树链剖分)

    FZU 2082 过路费 题目链接 树链抛分改动边的模板题 代码: #include <cstdio> #include <cstring> #include <vect ...

  7. FZU 2082 过路费 (树链剖分 修改单边权)

    题目链接:http://acm.fzu.edu.cn/problem.php?pid=2082 树链剖分模版题,求和,修改单边权. #include <iostream> #include ...

  8. FZU 2082 过路费(树链剖分)

    树链剖分模板题. FZU炸了,等交上去AC了再贴代码.

  9. FZU 2082 过路费

    树链剖分模板题 #include <cstdio> #include <iostream> #include <cstring> #include <algo ...

随机推荐

  1. 接口测试时遇到 java 代码加密请求数据,用 python 的我该怎么办?

    前言 自动化测试应用越来越多了,尤其是接口自动化测试. 在接口测试数据传递方面,很多公司都会选择对请求数据进行加密处理. 而目前为主,大部分公司的产品都是java语言实现的.所以加密处理也是java实 ...

  2. 再记一次经典Net程序的逆向过程

    1.前言 上次发完,有网友问了一个问题:如果不绕过编译,而是直接编译怎么办? 记一次Net软件逆向的过程:https://www.cnblogs.com/dotnetcrazy/p/10142315. ...

  3. host配置

    host添加地址 今天是我第一天入职,坐到工位的第一件事就是配置host,因为连接测试环境需要本地授权,所以要配置.这里简单记录下配置中遇到的问题和操作的步骤 操作环境是win10,之前公司一直使用的 ...

  4. Mysql之锁、事务绝版详解---干货!

    一 锁的分类及特性 数据库锁定机制简单来说,就是数据库为了保证数据的一致性,而使各种共享资源在被并发访问变得有序所设计的一种规则.对于任何一种数据库来说都需要有相应的锁定机制,所以MySQL自然也不能 ...

  5. Vue组件间通信-Vuex

    上回说到Vue组件间通讯,最后留了一个彩蛋~~~Vuex.Vuex是另一种组件通讯的方法,这节来说说Vuex(store仓库). 首先Vuex需要安装,安装的方式有很多,在这里就不一一细说了.我是通过 ...

  6. 记录一下我做Udacity 的Data Scientist Nano Degree Project

    做项目的时候看了别人的blog,决定自己也随手记录下在做项目中遇到的好的小知识点. 最近在做Udacity的Data Scientist Nano Degree Project的Customer_Se ...

  7. Log4j 2 配置

    版本区别 Log4j 2 与 log4j 1.x 最大的区别在于,新版本的 log4j 2 只支持 json 与 xml,不再支持以前的 properties 资源文件 下载 log4j 的jar 包 ...

  8. JS和C#.NET获取客户端IP

    我们经常在项目中会遇到这种需要获取客户端真实IP的需求,其实在网上也能随便就能查到各种获取的方法,我也是在网上查了加上了自己的实践,说一下自己在实践后的感受,基本上网上大部分都是用JS的方法来获取客户 ...

  9. javascript中的浅拷贝和深拷贝(拷贝引用和拷贝实例)

    作者:千锋教育链接:https://www.zhihu.com/question/23031215/answer/326129003来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请 ...

  10. 9个tcpdump使用实例

    tcpdump能帮助我们捕捉并保存网络包,保存下来的网络包可用于分析网络负载情况,包可通过tcpdump命令解析,也可以保存成后缀为pcap的文件,使用wireshark等软件进行查看. 以下将给出9 ...