FZU 2082 过路费
树链剖分模板题
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 50010
#define ls o<<1
#define rs o<<1|1
#define define_m int m=(l+r)>>1
#define ll long long
int first[N] , k;
struct Edge{
int x , y , next , w;
}e[N<<]; void add_edge(int x , int y , int w)
{
e[k].x = x , e[k].y = y , e[k].next = first[x] , e[k].w = w;
first[x] = k++;
} int sz[N] , dep[N] , fa[N] , son[N] , top[N] , id[N] , num;
void dfs(int u , int f , int d)
{
fa[u] = f , sz[u] = , dep[u]= d , son[u]=;
int mx = ;
for(int i=first[u] ; ~i ; i=e[i].next){
int v = e[i].y;
if(v == f) continue;
dfs(v , u , d+);
sz[u]+=sz[v];
if(sz[v]>mx) mx=sz[v] , son[u]=v;
}
} void dfs1(int u , int f , int head)
{
top[u]=head , id[u]=++num;
if(son[u]) dfs1(son[u] , u , head);
for(int i=first[u] ; ~i ; i=e[i].next){
int v = e[i].y;
if(v == f || v == son[u]) continue;
dfs1(v , u , v);
}
} ll sum[N<<] ;
int val[N];
void push_up(int o)
{
sum[o] = sum[ls]+sum[rs];
} void build(int o , int l , int r)
{
if(l==r){
sum[o]=(ll)val[l];
return ;
}
define_m;
build(ls , l , m);
build(rs , m+ , r);
push_up(o);
} void update(int o , int l , int r , int p , int v)
{
if(l==r){
sum[o]=(ll)v;
return;
}
define_m;
if(m>=p) update(ls , l , m , p , v);
else update(rs , m+ , r , p , v);
push_up(o);
} ll qSum(int o , int l , int r , int s , int t)
{
if(l>=s && r<=t) return sum[o];
define_m;
ll res = ;
if(m>=s) res+=qSum(ls , l , m , s , t);
if(m<t) res+=qSum(rs , m+ , r , s , t);
return res;
} ll calPath(int u , int v)
{
int top1 = top[u] , top2 = top[v] ;
ll ret=;
while(top1!=top2){
if(dep[top1]<dep[top2]){
swap(top1 , top2);
swap(u , v);
}
ret+=qSum( , , num , id[top1] , id[u]);
u = fa[top1];
top1 = top[u];
}
if(u!=v){
if(dep[u]<dep[v]) swap(u,v);
ret+=qSum(,,num,id[son[v]],id[u]);
}
return ret;
} int main()
{
// freopen("in.txt" , "r" , stdin);
int n , m , x , y , w;
while(scanf("%d%d" , &n , &m)!=EOF)
{
memset(first , - , sizeof(first));
k = ;
for(int i= ; i<n- ; i++){
scanf("%d%d%d" , &x , &y , &w);
add_edge(x , y , w);
add_edge(y , x , w);
}
dfs( , , );
num = ;
dfs1( , , );
for(int i= ; i<n- ; i++){
x = e[i*].x , y = e[i*].y;
if(fa[x]!=y) val[id[y]] = e[i*].w;
else val[id[x]] = e[i*].w;
}
build( , , num);
while(m--){
scanf("%d%d%d" , &w , &x , &y);
if(w){
printf("%I64d\n" , calPath(x , y));
}else{
x--;
int pos;
if(fa[e[x*].x]!=e[x*].y) pos = id[e[x*].y];
else pos = id[e[x*].x];
update( , , num , pos , y);
}
}
}
return ;
}
FZU 2082 过路费的更多相关文章
- FZU 2082 过路费(树链剖分)
FZU 2082 过路费 题目链接 树链抛分改动边的模板题 代码: #include <cstdio> #include <cstring> #include <vect ...
- fzu 2082 过路费 (树链剖分+线段树 边权)
Problem 2082 过路费 Accept: 887 Submit: 2881Time Limit: 1000 mSec Memory Limit : 32768 KB Proble ...
- FZU 2082 过路费 (树链剖分 修改单边权)
题目链接:http://acm.fzu.edu.cn/problem.php?pid=2082 树链剖分模版题,求和,修改单边权. #include <iostream> #include ...
- FZU 2082 过路费(树链剖分)
树链剖分模板题. FZU炸了,等交上去AC了再贴代码.
- FZU 2082 过路费(树链剖分 边权)题解
题意:给出每条边权值,可以更新每条边权值,询问两个点路径的最小权值 思路:重链剖分边权化点权,让每个儿子节点继承边权. 插点权的时候比较边的两个节点的深度,插进儿子节点中. 代码: #include& ...
- 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 ...
- FZU oj Problem 2082 过路费
Problem 2082 过路费 Pro ...
随机推荐
- Android 监听键盘的弹起与收缩
Android 监听键盘的弹起与收缩 由于android不存在该监听的API 所以需要自己去处理 先上代码 /* android:windowSoftInputMode="stateAlwa ...
- Android 空心和实心按钮
Android 空心和实心按钮 做界面时 有时老要用到这种按钮 动画如下 实心的 <?xml version="1.0" encoding="utf-8" ...
- hdu 4414 Finding crosses
题目链接:hdu 4414 其实是一道简单的字符型水题,不涉及任何算法,可比赛时却没能做出来,这几天的状态都差到家了... 题目大意是求有多少个满足条件的十字架,十字架的边不能有分叉路口,所以枚举每个 ...
- Android软键盘弹出时把布局顶上去的解决方法
原文: 解决Andriod软键盘出现把原来的布局给顶上去的方法(转) 链接:http://blog.sina.com.cn/s/blog_9564cb6e0101g2eb.html 决方法,在main ...
- Maven——使用Nexus搭建Maven私服
原文:http://www.cnblogs.com/xdp-gacl/p/4068967.html Maven学习总结(九)--使用Nexus搭建Maven私服 一.搭建nexus私服的目的 为什么要 ...
- [C++]访问控制与继承(public,protect,private) 有时间再整理!!!
http://www.cnblogs.com/chio/archive/2007/06/11/779408.html http://www.cnblogs.com/SelaSelah/archive/ ...
- VC++源文件编码
目录 第1章源代码文件 1 1.1 研究思路 1 1.2 实验结果 3 1.3 #pragma setlocale 4 1.4 /source-charset 5 1.5 ...
- mysql通过binlog日志来恢复数据
简介 在生产的过程中有这么一个业务场景:比如我在2016-11-19 09:30:00 通过mysqldump的方式备份了数据库,但是在2016-11-19 10:30:00的时候数据库崩溃了,如果通 ...
- 3.3 使用Code First数据库迁移
当Entity Framework Code First的数据模型发生异动时,默认会引发一个System.InvalidOpertaionException异常.一种解决方法是在Global.asax ...
- HTML5自学笔记[ 5 ]JSON的新方法
eval和JSON.parse的区别:eval:可以解析任何字符串为js:parse:只能解析JSON形式的字符串变为js(更安全). json格式的字符串中的属性名必须加双引号“”. stringi ...