poj 2763 Housewife Wind (树链剖分)
题目链接:http://poj.org/problem?id=2763
题意:
给定一棵含n个结点的树和树的边权,共有q次操作,分为两种
0 c :求从位置s到c的距离,然后s变成c
1 a b:把第a条边的权值变为b
分析:
树链剖分,注意查询后要改变起点
代码如下:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring> using namespace std;
const int maxn=; struct Edge
{
int to,next;
}edge[maxn*];
int head[maxn];
int cnt,tmp,n;
int dep[maxn],fa[maxn],size[maxn],son[maxn],top[maxn],id[maxn],rank[maxn];
struct Node
{
int u,v,c;
}node[maxn]; void init()
{
memset(head,-,sizeof(head));
memset(son,-,sizeof(son));
tmp=;
cnt=;
} void addedge(int u,int v)
{
edge[cnt].to=v;
edge[cnt].next=head[u];
head[u]=cnt++;
} void dfs_1(int u,int f,int d)
{
dep[u]=d;
size[u]=;
fa[u]=f;
for(int i=head[u];i!=-;i=edge[i].next)
{
int v=edge[i].to;
if(v==f)
continue;
dfs_1(v,u,d+);
size[u]+=size[v];
if(son[u]==-||size[son[u]]<size[v])
son[u]=v;
}
} void dfs_2(int u,int tp)
{
top[u]=tp;
id[u]=++tmp;
rank[tmp]=u;
if(son[u]!=-)
dfs_2(son[u],tp);
for(int i=head[u];i!=-;i=edge[i].next)
{
int v=edge[i].to;
if(v!=fa[u]&&v!=son[u])
dfs_2(v,v);
}
}
struct Tree
{
int left,right;
int t;
}tree[maxn*]; void pushup(int i)
{
tree[i].t=tree[i*].t+tree[i*+].t;
} void build(int i,int begin,int end)
{
tree[i].left=begin;
tree[i].right=end;
tree[i].t=;
if(begin==end)
return;
int mid=(begin+end)/;
build(i*,begin,mid);
build(i*+,mid+,end);
} void update(int i,int k,int val)
{
if(tree[i].left==k&&tree[i].right==k)
{
tree[i].t=val;
return;
}
int mid=(tree[i].left+tree[i].right)/;
if(k<=mid)
update(i*,k,val);
else
update(i*+,k,val);
pushup(i);
} int query(int i,int begin,int end)
{
if(tree[i].left>=begin&&tree[i].right<=end)
return tree[i].t;
int mid=(tree[i].left+tree[i].right)/;
int res=;
if(mid>=begin)
res+=query(i*,begin,end);
if(mid<end)
res+=query(i*+,begin,end);
return res;
} int find(int u,int v)
{
int tp1=top[u],tp2=top[v];
int res=;
while(tp1!=tp2)
{
if(dep[tp1]<dep[tp2])
{
swap(tp1,tp2);
swap(u,v);
}
res+=query(,id[tp1],id[u]);
u=fa[tp1];
tp1=top[u];
}
if(u==v)
return res;
if(dep[u]>dep[v])
swap(u,v);
res+=query(,id[son[u]],id[v]);
return res;
} int main()
{
int n,q,s;
scanf("%d%d%d",&n,&q,&s);
init();
for(int i=;i<n;i++)
{
scanf("%d%d%d",&node[i].u,&node[i].v,&node[i].c);
addedge(node[i].u,node[i].v);
addedge(node[i].v,node[i].u);
}
dfs_1(,,);
dfs_2(,);
build(,,tmp);
for(int i=;i<n;i++)
{
if(dep[node[i].u]>dep[node[i].v])
swap(node[i].u,node[i].v);
update(,id[node[i].v],node[i].c);
}
for(int i=;i<q;i++)
{
int a,k,w;
scanf("%d",&a);
if(a==)
{
scanf("%d",&k);
printf("%d\n",find(s,k));
s=k;
}
else
{
scanf("%d%d",&k,&w);
update(,id[node[k].v],w);
}
}
return ;
}
poj 2763 Housewife Wind (树链剖分)的更多相关文章
- POJ - 2763 Housewife Wind (树链剖分/ LCA+RMQ+树状数组)
题意:有一棵树,每条边给定初始权值.一个人从s点出发.支持两种操作:修改一条边的权值:求从当前位置到点u的最短路径. 分析:就是在边可以修改的情况下求树上最短路.如果不带修改的话,用RMQ预处理LCA ...
- POJ 2763 Housewife Wind (树链剖分 有修改单边权)
题目链接:http://poj.org/problem?id=2763 n个节点的树上知道了每条边权,然后有两种操作:0操作是输出 当前节点到 x节点的最短距离,并移动到 x 节点位置:1操作是第i条 ...
- poj 2763 Housewife Wind : 树链剖分维护边 O(nlogn)建树 O((logn)²)修改与查询
/** problem: http://poj.org/problem?id=2763 **/ #include<stdio.h> #include<stdlib.h> #in ...
- poj 2763 Housewife Wind(树链拆分)
id=2763" target="_blank" style="">题目链接:poj 2763 Housewife Wind 题目大意:给定一棵 ...
- POJ 2763 Housewife Wind 树链拋分
一.前言 这破题WA了一天,最后重构还是WA,最后通过POJ讨论版得到的数据显示,我看上去是把某个变量写错了..于是,还是低级错误背锅啊....代码能力有待进一步提升2333333 二.题意 某家庭主 ...
- POJ2763 Housewife Wind 树链剖分 边权
POJ2763 Housewife Wind 树链剖分 边权 传送门:http://poj.org/problem?id=2763 题意: n个点的,n-1条边,有边权 修改单边边权 询问 输出 当前 ...
- poj 2763(RMQ+BIT\树链剖分)
传送门:Problem 2763 https://www.cnblogs.com/violet-acmer/p/9686774.html 题意: 一对夫妇居住在xx村庄,小屋之间有双向可达的道路,不会 ...
- POJ.2763 Housewife Wind ( 边权树链剖分 线段树维护区间和 )
POJ.2763 Housewife Wind ( 边权树链剖分 线段树维护区间和 ) 题意分析 给出n个点,m个询问,和当前位置pos. 先给出n-1条边,u->v以及边权w. 然后有m个询问 ...
- POJ 2763 Housewife Wind LCA转RMQ+时间戳+线段树成段更新
题目来源:POJ 2763 Housewife Wind 题意:给你一棵树 2种操作0 x 求当前点到x的最短路 然后当前的位置为x; 1 i x 将第i条边的权值置为x 思路:树上两点u, v距离为 ...
随机推荐
- nyoj_120: 校园网络
题目链接 要加边使一个图成为一个强连通分量,只需加max(出度为0的点数,入度为0的点数)条边(可以不使用tarjan算法).题目数据有点弱,网上一些人所谓 结果 = 出度为0的点的数量+入度为0的点 ...
- Caused by: org.apache.catalina.LifecycleException: A child container failed during start
错误提示: 严重: A child container failed during start java.util.concurrent.ExecutionException: org.apache. ...
- Nginx文档-初学者指南
原文档: http://nginx.org/en/docs/beginners_guide.html 译者:Oopsguy 本指南旨在介绍nginx基本内容和一些在Nginx上可以完成的简单任务.这里 ...
- MySql数据库在表中添加新字段,设置主键,设置外键,字段移动位置,以及修改数据库后如何进行部署和维护的总结
1,为当前已有的表添加新的字段 alter table student add studentName varchar(20) not null; 2,为当前已有的表中的字段设置为主键自增 alter ...
- 云游戏学习与实践(二)——安装GamingAnywhere
安装GamingAnywhere 一.GamingAnywhere项目 GamingAnywhere是一个开源的实现云游戏的引擎,并且高效.跨平台.易扩展.可调配. GitHub地址:https:// ...
- 还在为CSS布局发愁?你该看看这7条原则
一.网页结构分析七条原则 这以下7个原则是经过多年网站实战经验之后的总结,只要掌握这7个原则,可以解决大部分在编写网站布局中的问题. 1.先结构后样式. 2.能用CSS表现出来的效果,就尽量少用图像. ...
- Mybatis Dynamic Query 框架整合
项目地址:https://github.com/wz2cool/mybatis-dynamic-query 文档地址:https://wz2cool.gitbooks.io/mybatis-dynam ...
- 初探Matplotlib
初探Matplotlib 例子来自此书: <Python编程从入门到实战>[美]Eric Matthes 使用pyplot绘图,一般的导入方法import matplotlib.pyplo ...
- 利用dbutils工具实现数据的增删查改操作(dbutis入门)
一.前期准备 1.安装数据库(如:mysql5.5) 2.安装Eclipse(如:3.4) 3.下载数据库驱动包 4.下载dbutis工具包 5.在Eclipse创建名为 dbutils 的工程并在工 ...
- 关于无法使用python执行进入百度页面的代码修改
前几天听了个坑爹的视频教学,按照你们的方法做了,但尼玛,执行下来各种问题啊: 首先进入页面,总是提示开发者模式,删了下次执行又挂了,于是乎我就找网上帖子解决问题,果然被我解决了 先装这两个文件,把浏览 ...