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,对 ...
随机推荐
- 输入n个数和输出调整后的n个数
输入n个数和输出调整后的n个数 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 148 Solved: 118 [Submit][Status][We ...
- ubuntu nginx安装及相关linux性能參数优化
一.安装 下载源代码,解压:tar -xzvf nginx-1.4.7.tar.gz ./configure make && make install 改动默认nginx的监听port ...
- 【Java】【Flume】Flume-NG源代码分析的启动过程(两)
本节分析配置文件的解析,即PollingPropertiesFileConfigurationProvider.FileWatcherRunnable.run中的eventBus.post(getCo ...
- 网络的基本概念TCP, UDP, 单播(Unicast), 多播(多播)(Multicast)
章相当低级,但相当重要! 我们周围一切差点儿都依赖于把事情抽象成低等级,并在某一点把它详细化,在一些设计概念中.接口层十分清晰而且目标非常集中,应用程序不用考虑操作系统怎样工作,操作系统也不用考虑硬件 ...
- Class撑起了OOP世界的天。Class类是OO的基本单元,OO的世界都是通过一个一个的类协作完成的,提高软件的重用性、灵活性和扩展性(转)
引言 在OO的工作中,我们一定会涉及到类,抽象类和接口.那么类和抽象类以及接口到底扮演的什么角色? 本文主要是从人类社会的角度阐述类与抽象类以及接口的“社会”关系,从而让我们抛弃书上的那些死记硬背的概 ...
- Arduino 数码管LED驱动器 阵列方法
样品谈到最后一个驱动程序LED数码管,采用了最简单的解决方案之一,对于每一个LED高低电平控制,这样的好处是每个LED控制可检.避免短路造成的错觉,因为,但是对于数字的变化是,它是多余的写,因此,这种 ...
- ER模型
一.什么是ER模型 实体-联系图(Entity-RelationDiagram)用来建立数据模型,在数据库系统概论中属于概念设计阶段,形成一个独立于机器.独立于DBMS的ER图模型.通常将它简称为ER ...
- Boost.Asio c++ 网络编程翻译(26)
Boost.Asio-其他特性 这章我们讲了解一些Boost.Asio不那么为人所知的特性.标准的stream和streambuf对象有时候会更难用一些,但正如你所见.它们也有它们的益处.最后,你会看 ...
- 库函数atoi()的实现
int atoi(const char *nptr); 假设第一个非空格字符存在,是数字或者正负号则開始做类型转换,之后检測到非数字(包含结束符 \0) 字符时停止转换.返回整形数. 否则,返回零. ...
- WP8加入自己定义铃声
1.下载千千静听绿色版,下载地址:http://pan.baidu.com/s/1ntuSNOH 2.将目标铃声加入到千千静听,选中铃声,右键选文件属性. 3.改动文件属性,将流派改为"Ri ...