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. 后端小白的VUE入门笔记, 前端高能慎入

    因为项目需要前后端分离,后端竟然不用控制view层了,页面的跳转后端不再干涉,(前端的vue经过打包后成了一张index.html) 后端只需要响应给前端json串就ok,其实这不是爽歪歪?但是觉得还 ...

  2. Activiti6系列(1)- 核心数据库表及字段注释说明

    前言 本文是根据<疯狂工作流讲义-Activiti6.0>一书中提取过来的,有兴趣的可以去当当网买这本书,讲的很不错,最后还有实战案例. 虽然是提取过来的,但完全靠手打梳理,觉得有用的小伙 ...

  3. (数据科学学习手札66)在ubuntu服务器上部署shiny

    一.简介 shiny是R中专门用于开发轻量级web应用的框架,在本地写一个shiny应用并调用非常方便,但如果你希望你的shiny应用能够以远程的方式提供给更多人来使用,就需要将写好的shiny应用部 ...

  4. Java 8原生API也可以开发响应式代码?

    前段时间工作上比较忙,这篇文章一直没来得及写,本文是阅读<Java8实战>的时候,了解到Java 8里已经提供了一个异步非阻塞的接口(CompletableFuture),可以实现简单的响 ...

  5. 使用sublime调试node.js

    安装node相关 从node官网下载node的安装文件,我下的版本是node-v0.10.22-x64.exe,安装完node,node相关工具应该都加都环境变量path中了. 命令行下安装node- ...

  6. android——Fragment

    谷歌官方文档的介绍: https://developer.android.com/guide/components/fragments.html#Design Fragment 表示 Activity ...

  7. CODING 告诉你如何建立一个 Scrum 团队

    原文地址:https://www.atlassian.com/agile/scrum/roles 翻译君:CODING 敏杰小王子 Scrum 当中有三个角色:PO(product owner),敏捷 ...

  8. imageloader+图片压缩

    public class MainActivity extends AppCompatActivity { private ImageView ivIcon; @Override protected ...

  9. DC-2靶机渗透

    靶场下载链接: Download: http://www.five86.com/downloads/DC-2.zip Download (Mirror): https://download.vulnh ...

  10. 利用QGIS下载地图数据

    这段时间做了一些利用地理信息进行定位导航的系列工作,其中很重要的一部分是如何获取到地图数据,比如道路的矢量图.某一区域的栅格图,我用到的主要工具是QGIS.QGIS是一个跨平台的免费应用,其中集成了对 ...