poj 2763 求树上的两个节点的最短距离+在线修改答案
题目链接: http://poj.org/problem?id=2763
#include<stdio.h>
#include<string.h>
#include<math.h>
#define clr(x)memset(x,0,sizeof(x))
#define maxn 200005
struct node
{
int to,next,w,xu;
}e[];
int tot;
int head[maxn];
void add(int s,int t,int wi,int xu)
{
e[tot].xu=xu; //边的序号
e[tot].w=wi;
e[tot].to=t;
e[tot].next=head[s];
head[s]=tot++;
}
int dp[maxn<<][];
int x[maxn<<];
int d[maxn];
int r[maxn];
int v[maxn];
int f[maxn];
int ll[maxn];
int rr[maxn];
int g[maxn];
int n,m;
int min(int i,int j)
{
return d[i]<d[j]?i:j;
}
void makermq(int nn)
{
int i,j;
for(i=;i<nn;i++)
dp[i][]=i;
for(j=;(<<j)<=nn;j++)
for(i=;i+(<<j)-<nn;i++)
dp[i][j]=min(dp[i][j-],dp[i+(<<(j-))][j-]);
}
int rmq(int l,int r)
{
int k=(int)(log((r-l+)*1.0)/log(2.0));
return min(dp[l][k],dp[r-(<<k)+][k]);
}
int cnt,ti;
void dfs(int u,int deep)
{
v[u]=; //标记节点是否被访问;
x[cnt]=u; //cnt为标记访问点先后顺序的一个序列,x数组即表示当前访问的节点。
d[cnt]=deep; // d数组表示当前访问节点的深度。
r[u]=cnt++; // r 数组是表示本节点第一次出现在访问序列中的位置;
ll[u]=++ti; //第一次访问节点的时间戳
int i,k;
for(i=head[u];i;i=e[i].next)
{
k=e[i].to;
if(!v[k])
{
g[e[i].xu]=k;
dfs(k,deep+);
x[cnt]=u; //回退时也要记录访问序列;
d[cnt++]=deep;
}
}
rr[u]=ti; //第二次访问这个节点的时间戳
}
int tree[maxn];
int lowbit(int x)
{
return (x)&(-x);
}
void update(int pos,int x)
{
while(pos<=n)
{
tree[pos]+=x;
pos+=lowbit(pos);
}
}
int sum(int pos)
{
int s=;
while(pos>)
{
s+=tree[pos];
pos-=lowbit(pos);
}
return s;
}
int edge[maxn];
int val[maxn];
int main()
{
int i,st;
while(scanf("%d%d%d",&n,&m,&st)!=EOF)
{
int a,b,c;
clr(head); clr(v);
clr(f); clr(tree);
tot=;
ti=-;
for(i=;i<n;i++)
{
scanf("%d%d%d",&a,&b,&c);
val[i]=c;
edge[i]=c;
add(a,b,c,i);
add(b,a,c,i);
}
cnt=;
dfs(,);
makermq(*n-);
for(i=;i<n;i++)
{
update(ll[g[i]],edge[i]);
update(rr[g[i]]+,-edge[i]);
}
int op;
while(m--)
{
scanf("%d",&op);
if(op==) //将树上的操作变成一个序列的操作。
{
scanf("%d%d",&a,&b);
update(ll[g[a]],-val[a]);
update(rr[g[a]]+,val[a]);
update(ll[g[a]],b);
update(rr[g[a]]+,-b);
val[a]=b;
}
else
{
scanf("%d",&a);
int lca,d1,d2,d3;
if(r[st]<=r[a])
lca=x[rmq(r[st],r[a])];
else lca=x[rmq(r[a],r[st])];
d1=sum(ll[st]);
d2=sum(ll[a]);
d3=sum(ll[lca]);
st=a;
printf("%d\n",d1+d2-*d3);
}
}
}
return ;
}
poj 2763 求树上的两个节点的最短距离+在线修改答案的更多相关文章
- LCA最近公共祖先模板(求树上任意两个节点的最短距离 || 求两个点的路进(有且只有唯一的一条))
原理可以参考大神 LCA_Tarjan (离线) TarjanTarjan 算法求 LCA 的时间复杂度为 O(n+q) ,是一种离线算法,要用到并查集.(注:这里的复杂度其实应该不是 O(n+q) ...
- poj 2763 Housewife Wind(树链剖分+单点查询+区间修改)
题目链接:http://poj.org/problem?id=2763 题意:给一个数,边之间有权值,然后两种操作,第一种:求任意两点的权值和,第二,修改树上两点的权值. 题解:简单的树链剖分. #i ...
- poj 3608(旋转卡壳求解两凸包之间的最短距离)
Bridge Across Islands Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9768 Accepted: ...
- Codeforces Round #588 (Div. 2)-E. Kamil and Making a Stream-求树上同一直径上两两节点之间gcd的和
Codeforces Round #588 (Div. 2)-E. Kamil and Making a Stream-求树上同一直径上两两节点之间gcd的和 [Problem Description ...
- POJ 2763 Housewife Wind (树链剖分 有修改单边权)
题目链接:http://poj.org/problem?id=2763 n个节点的树上知道了每条边权,然后有两种操作:0操作是输出 当前节点到 x节点的最短距离,并移动到 x 节点位置:1操作是第i条 ...
- POJ 2763 Housewife Wind LCA转RMQ+时间戳+线段树成段更新
题目来源:POJ 2763 Housewife Wind 题意:给你一棵树 2种操作0 x 求当前点到x的最短路 然后当前的位置为x; 1 i x 将第i条边的权值置为x 思路:树上两点u, v距离为 ...
- POJ - 2763 Housewife Wind (树链剖分/ LCA+RMQ+树状数组)
题意:有一棵树,每条边给定初始权值.一个人从s点出发.支持两种操作:修改一条边的权值:求从当前位置到点u的最短路径. 分析:就是在边可以修改的情况下求树上最短路.如果不带修改的话,用RMQ预处理LCA ...
- POJ 2763 Housewife Wind(DFS序+LCA+树状数组)
Housewife Wind Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 11419 Accepted: 3140 D ...
- 牛客小白月赛6 C 桃花 dfs 求树上最长直径
链接:https://www.nowcoder.com/acm/contest/136/C来源:牛客网 题目描述 桃花一簇开无主,可爱深红映浅红. ...
随机推荐
- 【坑】idea+tomcat
idea用tomcat外置容器部署debug要清掉webapp里面的同名项目,否则就呵呵呵呵了
- Markdown简要规则
We believe that writing is about content, about what you want to say – not about fancy formatting. 我 ...
- [Python Study Notes]计算器
# ------------------------------------------------------------------------------------- # @文件: 计算器.p ...
- MS_SQL_获取字符串最后出现的字符串及位置
一.如:'6.7.8.2.3.4.x'得到最后一个'.'后面的字符串: declare @str1 varchar(50) set @str1='6.7.8.2.3.4.x' select REV ...
- 错误信息:"OraOLEDB.Oracle" 返回了消息 "ORA-12154: TNS: 无法解析指定的连接标识符
错误信息:"OraOLEDB.Oracle" 返回了消息 "ORA-12154: TNS: 无法解析指定的连接标识符 链接服务器"NC"的 OLE D ...
- Solr之缓存篇
原文出自:http://my.oschina.net/u/1026644/blog/123957 Solr在Lucene之上开发了很多Cache功能,从目前提供的Cache类型有: (1)filter ...
- 2018 - Start Up
转眼2017已经过去,从大四下学期出来实习,到现在工作一年多了,很遗憾没有经营好自己博客园&CSDN. 献上一篇鼓励工程师写blog的博客:https://kb.cnblogs.com/pag ...
- vray学习笔记(1)vray介绍
vray是个什么东西? 它是个渲染器. 渲染器是个什么东西? 渲染器就是3d软件里面把模型画成一张图片的东西,渲染的过程就是把3D物体变成2D画面的过程. 模型是个什么东西? 模型就是模型,它由两部分 ...
- p3203 弹飞绵羊
传送门 分析 基本的lct操作,建一个点N表示弹飞出去的点,每次输出N的左子树的大小即可 代码 #include<iostream> #include<cstdio> #inc ...
- vue 之 介绍及简单使用
浏览目录 vue的介绍 vue的使用 vue的介绍 简介 vue官网说:Vue.js(读音 /vjuː/,类似于 view) 是一套构建用户界面的渐进式框架.与其他重量级框架不同的是,Vue 采用自底 ...