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来源:牛客网 题目描述 桃花一簇开无主,可爱深红映浅红. ...
随机推荐
- spring-初始化bean
@EnableScheduling@Servicepublic class BaseTask implements InitializingBean, ApplicationContextAware{ ...
- pthon爬虫(9)--Selenium的用法
简介 Selenium 是什么?一句话,自动化测试工具.它支持各种浏览器,包括 Chrome,Safari,Firefox 等主流界面式浏览器,如果你在这些浏览器里面安装一个 Selenium 的插件 ...
- Android基础学习:Android环境搭建
在3年前,自学过Android的一些基础知识,但是那个时候Linux等其他的知识结构比较薄弱,理解得不是很深刻,后来因项目变动的原因,没有再搞Android相关的东西了.时过境迁,还是因为项目变动,重 ...
- [hdu3949]XOR(线性基求xor第k小)
题目大意:求xor所有值的第k小,线性基模板题. #include<cstdio> #include<cstring> #include<algorithm> #i ...
- 静态页面HTML中标签的优化(转)
静态页面HTML中标签的优化 (2010-04-03 20:54:06) 标签: 电脑 name 罗马数字 css 表单 杂谈 分类: 网页制作 从网上看了一篇关于静态页面中标签优化的问题,感觉还不错 ...
- 详解CSS display:inline-block的应用(转)
详解CSS display:inline-block的应用 阅读目录 基础知识 inline-block的问题 inline-block的应用 总结 本文详细描述了display:inline-b ...
- HDU 6395(2018多校第7场1010)Sequence
不久前做过POJ3070,所以知道这题要用矩阵快速幂优化,但是这个题的递推公式中有一项⌊p/n⌋,场上就不会了... 下来才知道要用分块矩阵快速幂,因为⌊p/n⌋最多有2√p块,可以对每一块使用快速幂 ...
- Python02 标准输入输出、数据类型、变量、随记数的生成、turtle模块详解
1 标准输出 python3利用 print() 来实现标准输出 def print(self, *args, sep=' ', end='\n', file=None): # known speci ...
- JS中的引用类型
JS的数据类型可以分为两类:一类是原始类型(比如数字.布尔值.字符串.undefined.null),另外就是对象类型.我们通常将对象类型称为引用类型.对象值都是引用.举个例子来说明,下如下的代码: ...
- 怎么把网页保存为pdf文件
不就是用chrome浏览器打印功能,然后保存为pdf就可以了吗? 对于一些结构简单的比如,RFC文档这样操作一般没什么问题,对于一些有浮动元素的网页就不好说了,必须先用chrome的审查元素把一些不必 ...