擦,没啥好说的,这个模板至少得打10遍。。纪念自己成功的打错了。。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define LL int
#define lson id << 1
#define rson id << 1|1
const LL M = 100008;
LL ti[M],top[M],siz[M],son[M],father[M],tp,idx,dep[M];
struct Linetree{
LL sum,l,r,mark;
LL mid(){
return (l+r)/2;
}
}node[M*4];
struct {
LL head;
}H[M];
struct {
LL v,next;
}E[M];
void add(LL u,LL v){
E[tp].v = v;
E[tp].next = H[u]. head;
H[u].head = tp++;
} void dfs_1(LL u,LL fa){ son[u] = 0;siz[u] = 1;father[u] = fa; dep[u] = dep[fa] + 1;
for(LL i=H[u].head;i!=-1;i=E[i].next){
LL v = E[i].v;
if(v == fa)continue;
dfs_1(v,u);
siz[u] += siz[v];
if(siz[v] > siz[son[u]])son[u] = v ;
}
}
void dfs_2(LL u,LL fa){
ti[u] = idx++;
top[u] = fa;
if(son[u])dfs_2(son[u],fa);
for(LL i=H[u].head;i!=-1;i = E[i].next){
LL v = E[i].v;
if(v == father[u]||v == son[u]) continue;
dfs_2(v,v);
} }
/* 线段树*/
void build_tree(LL id,LL l,LL r){
node[id].l = l;
node[id].r = r;
node[id].sum = 0;
if(l == r) return;
LL mid = node[id].mid();
build_tree(lson,l,mid);
build_tree(rson,mid+1,r);
}
void push_up(LL id){
node[id].sum = node[lson].sum + node[rson].sum;
}
void update(LL id,LL k,LL w){
if(node[id].l == k&&node[id].r == k){
node[id].sum = w;
return;
}
LL mid = node[id].mid();
if(k <=mid)update(lson,k,w);
else update(rson,k,w);
push_up(id);
}
LL query(LL id,LL l,LL r){
if(node[id].l == l && node[id].r == r)
return node[id].sum;
LL mid = node[id].mid();
if(r <=mid )return query(lson,l,r);
else if(l > mid)return query(rson,l,r);
else {
return query(lson,l,mid) + query(rson,mid+1,r);
}
}
LL e[M][4];
LL findmax(LL u,LL v){
LL f1 = top[u];
LL f2 = top[v];
int sum = 0;
while(f1 != f2){
if(dep[f1] < dep[f2]){
swap(f1,f2);swap(u,v);
}
sum += query(1,ti[f1],ti[u]);
u = father[f1];f1 = top[u];
}
if(u == v) return sum;
if(dep[u] > dep[v] ) swap(u,v);
sum += query(1,ti[son[u]],ti[v]);
return sum;
}
void init(){
memset(E,-1,sizeof(E));
memset(H,-1,sizeof(H));
tp = 0;
idx = 0;
memset(son,0,sizeof(son));
}
int main(){
//freopen("input.txt","r",stdin);
LL n,m,u,v,w;
while(~scanf("%d%d",&n,&m)){
init();
for(LL i=0;i<n-1;i++){
scanf("%d%d%d",&e[i][0],&e[i][1],&e[i][2]);
add(e[i][0],e[i][1]);
add(e[i][1],e[i][0]);
}
dfs_1(1,1);
dfs_2(1,1);
build_tree(1,1,idx-1);
for(LL i=0;i<n-1;i++){
if(dep[e[i][0]] > dep[e[i][1]])
swap(e[i][0],e[i][1]);
update(1,ti[e[i][1]],e[i][2]);
}
while(m --){
scanf("%d%d%d",&w,&u,&v);
if(w)printf("%d\n",findmax(u,v));
else update(1,ti[e[u-1][1]],v);
}
}
}

foj 2082 树链剖分 第2天的更多相关文章

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

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

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

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

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

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

  4. BZOJ 2157: 旅游( 树链剖分 )

    树链剖分.. 样例太大了根本没法调...顺便把数据生成器放上来 -------------------------------------------------------------------- ...

  5. BZOJ 3626: [LNOI2014]LCA [树链剖分 离线|主席树]

    3626: [LNOI2014]LCA Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2050  Solved: 817[Submit][Status ...

  6. BZOJ 1984: 月下“毛景树” [树链剖分 边权]

    1984: 月下“毛景树” Time Limit: 20 Sec  Memory Limit: 64 MBSubmit: 1728  Solved: 531[Submit][Status][Discu ...

  7. codevs 1228 苹果树 树链剖分讲解

    题目:codevs 1228 苹果树 链接:http://codevs.cn/problem/1228/ 看了这么多树链剖分的解释,几个小时后总算把树链剖分弄懂了. 树链剖分的功能:快速修改,查询树上 ...

  8. 并查集+树链剖分+线段树 HDOJ 5458 Stability(稳定性)

    题目链接 题意: 有n个点m条边的无向图,有环还有重边,a到b的稳定性的定义是有多少条边,单独删去会使a和b不连通.有两种操作: 1. 删去a到b的一条边 2. 询问a到b的稳定性 思路: 首先删边考 ...

  9. 树链剖分+线段树 CF 593D Happy Tree Party(快乐树聚会)

    题目链接 题意: 有n个点的一棵树,两种操作: 1. a到b的路径上,给一个y,对于路径上每一条边,进行操作,问最后的y: 2. 修改某个条边p的值为c 思路: 链上操作的问题,想树链剖分和LCT,对 ...

随机推荐

  1. (2) 用DPM(Deformable Part Model,voc-release4.01)算法在INRIA数据集上训练自己的人体检測模型

    步骤一,首先要使voc-release4.01目标检測部分的代码在windows系统下跑起来: 參考在window下执行DPM(deformable part models) -(检測demo部分) ...

  2. 【剑指offer】面试题39:深度二叉树

    def TreeDepth1(root): if None == root: return 0 if None == root.left and None == root.right: return ...

  3. Hibernate一个简短的引论

    我们从几个方面进行阐述Hibernate When? What ? How? When? Hibernate由来是因为当时EJBBean1.1在处理entittBean架构时,花费的时间要比业务逻辑很 ...

  4. 50一个Android开发技巧(01 利用好layout_weight属性)

    问题:如何将一个Button放置在布局的中间,并设置其宽度parent的50%? 分析:问题想要达到的效果应该是这样: (原文地址:http://blog.csdn.net/vector_yi/art ...

  5. Centos 7 静态学习IP建立

    该研究主要集中在 Centos 7.0.1406 学习整理版! 1.编者 ifcfg-eth0 档,vim 同时尽量减少未安装安装,你并不需要自己安装叙述性说明. # vim /etc/sysconf ...

  6. ZendFramework2学习笔记 json和ajax

    单程: View服务寄存器ViewJsonStrategy之后,有可能直接在控制器action是使用JsonViewModel输出json的数据. 注冊ViewJsonStrategy: //modu ...

  7. Visual Studio Team Services使用教程--添加团队成员

  8. Android 获取屏幕大小和密度

    Android 获取屏幕大小和密度 DisplayMetrics metric = new DisplayMetrics(); getWindowManager().getDefaultDisplay ...

  9. Java 新特性(3) - JDK7 新特性

    http://www.ibm.com/developerworks/cn/java/j-lo-jdk7-1/ JSR292:支持动态类型语言(InvokeDynamic) 近 年来越来越多的基于 JV ...

  10. 北京设计模式学习组bjdp.org第7次活动(2013.08.04)回顾会纪要

    时间:2013.08.04,9am-7pm 地点:北京龙泉寺(北京凤凰岭风景区内) 参加人数:北京龙泉寺信息中心(20人).北京设计模式学习组(9人) 活动要点: 1)寺院巡礼:义工师兄带领参观寺院. ...