树链剖分模板题

 #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 过路费的更多相关文章

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

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

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

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

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

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

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

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

  5. FZU 2082 过路费(树链剖分 边权)题解

    题意:给出每条边权值,可以更新每条边权值,询问两个点路径的最小权值 思路:重链剖分边权化点权,让每个儿子节点继承边权. 插点权的时候比较边的两个节点的深度,插进儿子节点中. 代码: #include& ...

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

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

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

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

  8. FZU Problem 2082 过路费

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

  9. FZU oj Problem 2082 过路费

                                                                                    Problem 2082 过路费 Pro ...

随机推荐

  1. android模拟器中文乱码

    问题:在xml文件中设置的中文能正确输出,但是在java文件中设置的中文会在模拟器上呈现乱码 解决方案:在build.gradle文件中添加一行代码 android {compileOptions.e ...

  2. iOS开发之 Xcode6 添加xib文件,去掉storyboard的hello world应用

    iOS开发之  Xcode6.1创建仅xib文件,无storyboard的hello world应用 由于Xcode6之后,默认创建storyboard而非xib文件,而作为初学,了解xib的加载原理 ...

  3. [转]Android_气泡效果

    最近在看以前在eoe上收藏的一些源代码,准备将这些代码加上一些自己的注释,然后贴出来,方便自己日后查阅,和刚入门的人来学习. 今天先看一个气泡窗口,先看一下效果图和目录结构,然后再上代码 通过第一幅图 ...

  4. 部署git服务器 gitServer 软件

    部署git服务器 gitServer 软件 搭建git服务器也并不是非常的难,有这么多优秀的软件,选择一个适合自己就行了 1. windows版本 http://gitstack.com/ 免费版本, ...

  5. MM中如何更改物料的评估类

    在SAP MM模块中,一物料XXX ,由原来的外购,变成厂内自制:评估类也由原来的7901 改为:7900 : 注:物料的评估类,对应一些帐号,对发生的为业,产生的数据,记录在相对的帐号里: 如要更改 ...

  6. object-c NSString 转成特定编码格式如utf8、gbk等

    有两种方式 第一种是先转换成特定编码格式NSDATA 第二种是先转换成特定编码格式char *(cString) 转成gbk: 第一种: - (NSString *) utf82gbk:(NSStri ...

  7. 【bzoj1019】汉诺塔

    [bzoj1019]汉诺塔 题意 传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1019 分析 思路1:待定系数+解方程 设\(f[n]\)为 ...

  8. Java replace() 方法

    Java replace() 方法 Java String类 replace() 方法通过用 newChar 字符替换字符串中出现的所有 oldChar 字符,并返回替换后的新字符串. 语法 publ ...

  9. javascript常用函数(1):jquery操作select 基本操作

    $(this).children('option:selected').val();//这就是selected的值 $("#charCity").empty();//内容清空: j ...

  10. (03)odoo模型/记录集/公用操作

    -----------------更新时间11:17 2016-09-18 星期日11:00 2016-03-13 星期日09:10 2016-03-03 星期四11:46 2016-02-25 星期 ...