FZU oj Problem 2082 过路费
Problem 2082 过路费
Problem Description
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
Sample Output
#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 过路费的更多相关文章
- Fzu Problem 2082 过路费 LCT,动态树
题目:http://acm.fzu.edu.cn/problem.php?pid=2082 Problem 2082 过路费 Accept: 528 Submit: 1654Time Limit ...
- FZU Problem 2082 过路费 树链剖分
Problem 2082 过路费 Problem Description 有n座城市,由n-1条路相连通,使得任意两座城市之间可达.每条路有过路费,要交过路费才能通过.每条路的过路费经常会更新, ...
- FZU Problem 2082 过路费
Problem 2082 过路费 Accept: 875 Submit: 2839Time Limit: 1000 mSec Memory Limit : 32768 KB Problem ...
- FOJ题目Problem 2082 过路费 (link cut tree边权更新)
Problem 2082 过路费 Accept: 382 Submit: 1279 Time Limit: 1000 mSec Memory Limit : 32768 KB Proble ...
- fzu 2082 过路费 (树链剖分+线段树 边权)
Problem 2082 过路费 Accept: 887 Submit: 2881Time Limit: 1000 mSec Memory Limit : 32768 KB Proble ...
- FZU 2082 过路费(树链剖分)
FZU 2082 过路费 题目链接 树链抛分改动边的模板题 代码: #include <cstdio> #include <cstring> #include <vect ...
- FZU 2082 过路费 (树链剖分 修改单边权)
题目链接:http://acm.fzu.edu.cn/problem.php?pid=2082 树链剖分模版题,求和,修改单边权. #include <iostream> #include ...
- FZU 2082 过路费(树链剖分)
树链剖分模板题. FZU炸了,等交上去AC了再贴代码.
- FZU 2082 过路费
树链剖分模板题 #include <cstdio> #include <iostream> #include <cstring> #include <algo ...
随机推荐
- 【iOS】UIAlertView 点击跳转事件
iOS 开发中,UIAlertView 经常用到.这里记录下曾用到的点击跳转事件. UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@& ...
- [重磅开源] 比SingleR更适合的websocket 即时通讯组件---ImCore开源了
有感而发 为什么说 SignalR 不合适做 IM? IM 的特点必定是长连接,轮训的功能用不上. 因为它是双工通讯的设计,用hub.invoke发送命令给服务端处理业务,其他就和 ajax 差不多, ...
- android蓝牙通讯开发(详细)
新建一个工程之后,我们可以先看到界面左边的项目栏,我们可以看到,除了app目录以外,大多数的文件和目录都是自动生成的,我们也不需要对他们进行修改,而app目录之下的文件才是我们工作的重点.下面,我先对 ...
- netty使用EmbeddedChannel对channel的出入站进行单元测试
一种特殊的Channel实现----EmbeddedChannel,它是Netty专门为改进针对ChannelHandler的单元测试而提供的. 名称 职责 writeInbound 将入站消息写到E ...
- 初识Apache NiFi
一. NiFi介绍 Apache NiFi支持功能强大且可扩展的数据路由,转换和系统中介逻辑的有向图. Apache NiFi的一些高级功能和目标包括: 基于Web的用户界面 设计,控制,反馈和监控之 ...
- 使用RedisMQ 做一次分布式改造
引言 熟悉TPL Dataflow博文的朋友可能记得这是个单体程序,使用TPL Dataflow 处理工作流任务, 在使用Docker部署的过程中, 有一个问题一直无法回避: 在单体程序部署的瞬间会有 ...
- LR(1)语法分析器生成器(生成Action表和Goto表)java实现(一)
序言 : 在看过<自己实现编译器链接器>源码之后,最近在看<编译器设计>,但感觉伪代码还是有点太浮空.没有掌握的感觉,也因为内网几乎没有LR(1)语法分析器生成器的内容,于是我 ...
- Java虚拟机(一)-Java内存区域
通过看深入理解java虚拟机这本书,大致总结一些笔记,或者提出一些问题,希望大家深入交流学习,第一次写博客,大家多多支持 Java虚拟机对于很多Java开发人员每天都在用,但是大部分人初学者对这些并不 ...
- laravel新项目报错 No application encryption key has been specified.
解决办法, 若文件根目录下没有 .env 1..env.example 改名使用命令 copy 修改为 .env 2.使用命令 php artisan key:generate 获取密码,自动保存到 ...
- 安装VMware14虚拟机,centos7版本的linux 软件地址
首先下载虚拟机软件和centos7的linux系统的镜像软件系统, https://pan.baidu.com/s/1cJfzpaLwB4dfe2W8gGEAPQ 两个文件 非常好用 虚拟机安装 很简 ...