foj 2082 树链剖分 第2天
擦,没啥好说的,这个模板至少得打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天的更多相关文章
- FZU 2082 过路费 (树链剖分 修改单边权)
题目链接:http://acm.fzu.edu.cn/problem.php?pid=2082 树链剖分模版题,求和,修改单边权. #include <iostream> #include ...
- fzu 2082 过路费 (树链剖分+线段树 边权)
Problem 2082 过路费 Accept: 887 Submit: 2881Time Limit: 1000 mSec Memory Limit : 32768 KB Proble ...
- FZU 2082 过路费(树链剖分)
树链剖分模板题. FZU炸了,等交上去AC了再贴代码.
- BZOJ 2157: 旅游( 树链剖分 )
树链剖分.. 样例太大了根本没法调...顺便把数据生成器放上来 -------------------------------------------------------------------- ...
- BZOJ 3626: [LNOI2014]LCA [树链剖分 离线|主席树]
3626: [LNOI2014]LCA Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2050 Solved: 817[Submit][Status ...
- BZOJ 1984: 月下“毛景树” [树链剖分 边权]
1984: 月下“毛景树” Time Limit: 20 Sec Memory Limit: 64 MBSubmit: 1728 Solved: 531[Submit][Status][Discu ...
- codevs 1228 苹果树 树链剖分讲解
题目:codevs 1228 苹果树 链接:http://codevs.cn/problem/1228/ 看了这么多树链剖分的解释,几个小时后总算把树链剖分弄懂了. 树链剖分的功能:快速修改,查询树上 ...
- 并查集+树链剖分+线段树 HDOJ 5458 Stability(稳定性)
题目链接 题意: 有n个点m条边的无向图,有环还有重边,a到b的稳定性的定义是有多少条边,单独删去会使a和b不连通.有两种操作: 1. 删去a到b的一条边 2. 询问a到b的稳定性 思路: 首先删边考 ...
- 树链剖分+线段树 CF 593D Happy Tree Party(快乐树聚会)
题目链接 题意: 有n个点的一棵树,两种操作: 1. a到b的路径上,给一个y,对于路径上每一条边,进行操作,问最后的y: 2. 修改某个条边p的值为c 思路: 链上操作的问题,想树链剖分和LCT,对 ...
随机推荐
- Webots入门(二)-build up a controller
A simple controller 控制器程序读取传感器的值,然后改动行走速度来避开障碍物. 以下是控制器源码mybot_simple.c: #include<webots/robot.h& ...
- 无需Visual Studio,5容易的 - 分为报告
总报告设计,例如RDLC.水晶报表等.,需要安装Visual Studio.由VS提供报表设计界面设计报告,由VS设计报告.NET非常方便开发者,.但对于非开发,安装4G一个VS.并且需要Licens ...
- overflow的几个坑
在android 4.0的原生浏览器上注意: html元素上不要加overflow: auto;的样式,否则会造成有些元素无法点击 在absolute元素上 不要加 overflow: auto; 否 ...
- C# 字段、属性、成员变量
引言: C#与java,C++中的这些基本概念略有不同. 由于easy混淆,所以这里总结下差别. 希望能对刚開始学习的人有帮助! 一.定义与作用 1.字段(field):是C#类级别定义的,和方法同一 ...
- Linux管道通信
1.Linux内部自己实现了管道的同步,但多个读或者多个写之间的互斥,还需要自己实现.
- nodejs 模拟form表单上传文件
使用nodejs来模拟form表单进行文件上传,可以同时上传多个文件. 以前项目里有这个方法,最近在客户那里出问题了,同事说,这个方法从来就没管用过,SO,用了一天时间把这个方法给搞出来了(觉得花费的 ...
- mysql数据库的安装以及常见优化设置
原文请详见:http://www.ucai.cn/blogdetail/7036?mid=1&f=5 能够在线执行查看效果哦! 本文依据优才网课程整理,面向web开发人员,内容以有用为主,专业 ...
- Codeforces Round #216 (Div. 2) E. Valera and Queries (BIT)
标题效果: 给很多分布 x 行轴. 然后给出了一个非常的多点集,问该组点分布多少不同段. IDEAS: 分散成多个线段点集的. 给出的线段的话,也就是说这个点集上不会有点在这条线段上. 所以我们就是求 ...
- SharePoint 2013 母版页修改后,无法添加应用程序
原文:SharePoint 2013 母版页修改后,无法添加应用程序 问题描述:前一段时间尝试了一下将HTML文件转换为母版页,但是,用着用着又发现新的问题,我们转换的母版页,设置成默认母版页以后,无 ...
- LinkedBlockingQueue的put,add跟offer的区别(转)
LinkedBlockingQueue的put,add和offer的区别 最近在学习<<Java并发编程实践>>,有很多java.util.concurrent包下的新类.Li ...