擦,没啥好说的,这个模板至少得打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. C指针决心 ------ 指针的概念和元素

     本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020 指针在C语言中的地位,不用多说. 指针的概念 指针是一个特殊的变量,它里面存储 ...

  2. Freedur为什么免费?

    难道没有人看到他们官方网站权? Freedur倒闭了...... 一个中国人.Chris Lee,作为Freedur的会计师.窃取了公司的银行帐号.并将Freedur的官方站点指向自己的空间. 而且声 ...

  3. 探索C/C++大数快(自然数)模板

    本文fcbruce个人原创整理.转载请注明出处http://blog.csdn.net/u012965890/article/details/40432511,谢谢. 我们知道在C/C++中int型可 ...

  4. iOS pragma mark要使用

    郝萌主倾心贡献,尊重作者的劳动成果.请勿转载. 假设文章对您有所帮助.欢迎给作者捐赠.支持郝萌主,捐赠数额任意.重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 简单的来说 ...

  5. iOS_67控件外观对照

    iOS 7 button无边框,操作栏透明,控制器全屏 Tab Bar 对照 iOS 7                                                         ...

  6. C#设计及其UML(反向工程)

    OOP之C#设计及其UML(反向工程)   现在总结一下C#类关键字(virtual.abstract.override.new.sealed)的使用(以C#代码体现),并再次熟悉一下OOP思想,使用 ...

  7. 【夯实基础】javakeywordsynchronized 详细说明

    尊重版权:http://www.cnblogs.com/GnagWang/archive/2011/02/27/1966606.html Java语言的keyword.当它用来修饰一个方法或者一个代码 ...

  8. crm2011i创建nt类型字段

    using System;     using Microsoft.Xrm.Sdk;     using Microsoft.Xrm.Sdk.Messages;     using Microsoft ...

  9. myeclipse中间classpath

    myeclipse中间classpath这是一个非常重要的问题 myeclipse是搜索寻找在按照时间其,和myeclipse有一个特殊的文件来保存classpath信息.这也是别人的项目文件的副本时 ...

  10. SQL Server中tempdb的管理

    原文:SQL Server中tempdb的管理 资料来自: http://blogs.msdn.com/b/sqlserverstorageengine/archive/tags/tempdb/ ht ...