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来源:牛客网 题目描述 桃花一簇开无主,可爱深红映浅红. ...
随机推荐
- Python之整数,浮点数和布尔类型
整数和浮点数有那个四则运算: 两种类型的数可以直接进行加减,当整数和浮点数进行加减的时候,结果会自动的变为浮点数,其中除法运算是“/”来表示的, 而余数的算术符号是“%”来表示的.如果是为了求除完后的 ...
- python的程序书写以及保存
在前面的微博里已经叙述Python的安装以及路径的设置. 在我们的windows的电脑上面我们已经安装完了python以及设置了它的路径,所以我们可以再cmd里面进行Python的编写(cmd的快速打 ...
- android手势(gesture)
需要实现两个接口,OnTouchListener ,OnGestureListener 在接口方法中实现各种事件 详见:http://www.cnblogs.com/JczmDeveloper/p/3 ...
- Template Method模式和Strategy模式有何异同
Template Method模式和Strategy模式有何异同 博客分类: 设计模式 Java Template Method模式很容易理解,就是由基类提供一个模板,将各子类中不变的行为提取到基类 ...
- 用于.NET环境的时间测试(转)
用于.NET环境的时间测试 在.NET环境中,衡量运行完整算法所花费的时间长度,需要考虑很多 需要考虑很多种情况 ,如:程序运行所处的线程以及无用单位收集(GC垃圾回收). 在程序执行过程中无用单 ...
- ROS Learning-026 (提高篇-004 A Mobile Base-02) 控制移动平台 --- “分封制”
ROS 提高篇 之 A Mobile Base-02 - 控制移动平台 - "分封制" 我使用的虚拟机软件:VMware Workstation 11 使用的Ubuntu系统:Ub ...
- 杭电acm 1015题
马上要找工作了,锻炼下自己的写程序能力,不多说,上代码 /********************杭电acm 1015 已AC 在这个程序里,使用穷举法来实现,但是输出顺序需要安装字典的最大 来输出 ...
- GCC 版本与C11标准
1. GCC版本是否支持C11 C89=C90:gcc选项是:-ansi, -std=c90 or -std=iso9899:; 带了GNU扩展的:-std=gnu90 C94=C95:gcc选项:- ...
- 创建Mat对象
Mat 是一个非常优秀的图像类,它同时也是一个通用的矩阵类,可以用来创建和操作多维矩阵.有多种方法创建一个 Mat 对象. 1.构造函数方法 下面是一个使用构造函数创建对象的例子. 常用的构造函数 2 ...
- Java Calendar 类的时间操作.RP
JavaCalendar 类时间操作,这也许是创建和管理日历最简单的一个方案,示范代码很简单. 演示了获取时间,日期时间的累加和累减,以及比较. 原文地址:blog.csdn.NET/joyous/a ...