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. 前端笔记之React(六)ES6的Set和Map&immutable和Ramda和lodash&redux-thunk

    一.ES6的Set.Map数据结构 Map.Set都是ES6新的数据结构,都是新的内置构造函数,也就是说typeof的结果,多了两个: Set 是不能重复的数组 Map 是可以任何东西当做键的对象 E ...

  2. 快速字符串匹配一: 看毛片算法(KMP)

    前言 由于需要做一个快速匹配敏感关键词的服务,为了提供一个高效,准确,低能耗的关键词匹配服务,我进行了漫长的探索.这里把过程记录成系列博客,供大家参考. 在一开始,接收到快速敏感词匹配时,我就想到了 ...

  3. JAVA基础——Switch条件语句

    JAVA基础——switch 条件语句 switch语句结构: switch(表达式){ case值1: 语句体1: break: case值2: 语句体2: break: case值3: 语句体3: ...

  4. [ubuntu][deepin]系统增加自定义开机启动项

    [ubuntu][deepin]系统增加自定义开机启动项 进行配置 cd /etc/init.d/ ls vim myScript nginx实例 #! /bin/sh # chkconfig: # ...

  5. python异常处理-异常捕获-抛出异常-断言-自定义异常-UDP通信-socketserver模块应用-3

    异常捕获 异常:程序在运行过程中出现了不可预知的错误,并且该错误没有对应的处理机制,那么就会以异常的形式表现出来 影响:整个程序无法再正常运行 异常的结构 异常的类型 NameError 异常的信息 ...

  6. Tomcat源码分析 (二)----- Tomcat整体架构及组件

    前言 Tomcat的前身为Catalina,而Catalina又是一个轻量级的Servlet容器.在美国,catalina是一个很美的小岛.所以Tomcat作者的寓意可能是想把Tomcat设计成一个优 ...

  7. 使用JMS接口接入WebSphere MQ消息

    在你的应用程序中利用IBM WebSphere MQ消息中间件提供Java消息服务开放接口. IBM WebSphere MQ(WMQ)是一套面向消息的中间件(message-oriented mid ...

  8. ASP.NET Core on K8S深入学习(4)你必须知道的Service

    本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章. 前面几篇文章我们都是使用的ClusterIP供集群内部访问,每个Pod都有一个 ...

  9. AutoCAD二次开发(.Net)之创建图层Layer

    //https://blog.csdn.net/qq_21489689?t=1[CommandMethod("CREATELY")] public void CreateLayer ...

  10. java并发系列 - 第28天:实战篇,微服务日志的伤痛,一并帮你解决掉

    这是java高并发系列第28篇文章. 环境:jdk1.8. 本文内容 日志有什么用? 日志存在的痛点? 构建日志系统 日志有什么用? 系统出现故障的时候,可以通过日志信息快速定位问题,修复bug,恢复 ...