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距离为 ...
随机推荐
- hdu_3746: Cyclic Nacklace
题目链接 给出一个字符串,你可以通过在首尾加入字符使其变成一个具有周期T(T>=2)的字符串,求所需加入的最少字符数. 所考察算法仍然是对next数组含义的理解 #include<cstd ...
- 【canvas学习笔记一】基本认识
<canvas>标签定义了一块画布,画布可以在网页中绘制2D和3D图象,现在先学习如何绘制2D图象,绘制3D图象属于WebGL的内容(也就是网页版的OpenGL,3D图形接口). 属性 & ...
- mvc 下的 signalR使用小结
https://my.oschina.net/u/867090/blog/123474
- centos6.8 静默安装 oracle 11.2.0.4
安装环境及系统要求 (下文具体参数值与路径根据自己的环境调整)操作系统:Red Hat Enterprise Linux 6 (x86) 或者CentOS 6 (x64) 数据库:Oracle ...
- 使用pdfbox分页保存pdf为图片
一.背景 pdfbox作为Apache开源的PDF操作工具,允许创建新的PDF文档,操作现有文档,以及从文档中提取内容的能力.Apache PDFBox还包括一些命令行实用工具.本文楼主主要介绍其中的 ...
- wordpress设置“固定链接”后,页面404错误的解决方法
Nginx 解决方案: 网上盛传的方法是: 在 /etc/nginx/nginx.conf文件的 loction / {} 中添加 if (-f $request_filename/index.htm ...
- spring持久类po或者javabean为什么常常实现序列化?
无论用hibernate或者mybatis结合spring做开发还是其他,系统里持久类往往要实现序列化, implements Serializable.我还是比较好奇,为什么要这样做呢?一直只知道个 ...
- salesforce零基础学习(七十八)线性表链形结构简单实现
前两篇内容为栈和队列的顺序结构的实现,栈和队列都是特殊的线性表,线性表除了有顺序结构以外,还有线性结构. 一.线性表的链形结构--链表 使用顺序存储结构好处为实现方式使用数组方式,顺序是固定的.所以查 ...
- Appium实现的技巧
截图功能: //截屏并保存至本地 File screen = driver.getScreenshotAs(OutputType.FILE); File ...
- Java入门——(8)网络编程
关键词:IP地址..端口.UDP.DatagramPacket类.DatagramSocket类.TCP.ServerSocket类.Socket类.文件上传 一.基本概念 ...