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距离为 ...
随机推荐
- 设计模式的征途—14.职责链(Chain of Responsibility)模式
相信大家都玩过类似于“斗地主”的纸牌游戏,某人出牌给他的下家,下家看看手中的牌,如果要不起,则将出牌请求转发给他的下家,其下家再进行判断.一个循环下来,如果其他人都要不起该牌,则最初的出牌者可以打出新 ...
- sqlserver提高篇
Microsoft SQL Server2008复习提高 一.Microsoft SQL Server 系统的体系结构 1.Microsoft SQL Server2008由4个主要的部分组成,即4个 ...
- Serv-u Mysql数据库用户
Serv-u 关联Mysql数据库用户需要用到ODBC数据源,windows不自带支持MySQL.所以要网上下载自己安装 官网下载地址:http://dev.mysql.com/downloads/c ...
- 单元测试报connection is allready closed导致dailybuild中断的解决方案——类加载机制的应用
现象; 前段时间在dailybuild过程中,经常遇到connection is allready closed错误,特别是在dailybuild高峰期. 分析定位: 这个错误是的起因比较多,这里的情 ...
- Windows 10 IoT Serials 9 – 如何利用IoTCoreAudioControlTool改变设备的音频设备
大家知道,在Windows 10 IoT Core上,如果用户外接了USB声卡.带有麦克风的摄像头之类的硬件,就会有多个音频设备可以用.但是,系统目前并没有提供直接的UI来设置音频的输入或者输出设备. ...
- 老生常谈之SQL Server (行转列,列转行)
Open the first article 在本文章中主要介绍以下内容: 1.静态行转列 2.静态列转行 3.动态行转列 4.动态列转行 1.静态行转列 --静态的行转列 --新建一个科目成绩表 - ...
- servlet之注册登录(简写)
1.注册页面 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEn ...
- Azure 认知服务 (4) 计算机视觉API - 读取图片中的文字 (OCR)
<Windows Azure Platform 系列文章目录> 微软Azure认知服务的计算机视觉API,还提供读取图片中的文字功能 在海外的Windows Azure认知服务的读取图片功 ...
- RobotFramework自动化测试框架的基础关键字(五)
1.1.1 Run Keyword If判断的使用 Run Keyword If是一个常用的用来做逻辑判断的关键字,意思是如果满足了某一个判断条件,然后就会执行关键字,我们对list3中 ...
- 解决js中post提交数据并且跳转到指定页面的问题总结
今天在开发中过程中遇到了这个问题,js中利用JQuery中的 $.post("url", id, function(){}); 这个方法是数据提交正常,但是后台处理完成之后跳转无法 ...