POJ2763 Housewife Wind (树链剖分)
差不多是模板题,不过要注意将边权转化为点权,将边的权值赋给它所连的深度较大的点。
这样操作过后,注意查询ask()的代码有所改变(见代码注释)
1 #include<cstdio>
2 #include<cstring>
3 #include<algorithm>
4 using namespace std;
5 const int maxn=100010;
6 int head[maxn],to[maxn<<1],nxt[maxn<<1],tot,cnt;
7 int fa[maxn],dep[maxn];
8 int size[maxn],son[maxn],top[maxn];
9 int id[maxn],rev[maxn];
10 int Sum;
11
12 struct edge{
13 int u,v,w;
14 }a[maxn];
15
16 struct node{
17 int l,r,sum;
18 }tree[maxn<<2];
19
20 void add(int u,int v){
21 nxt[++tot]=head[u];
22 head[u]=tot;
23 to[tot]=v;
24 }
25
26 void init(){
27 tot=cnt=0;
28 memset(head,0,sizeof(head));
29 memset(son,0,sizeof(son));
30 }
31
32 void dfs1(int u,int f){
33 size[u]=1,fa[u]=f,dep[u]=dep[f]+1;
34 for(int i=head[u];i;i=nxt[i]){
35 int v=to[i];
36 if(v==f) continue;
37 dfs1(v,u);
38 size[u]+=size[v];
39 if(size[v]>size[son[u]]) son[u]=v;
40 }
41 }
42
43 void dfs2(int u,int t){
44 top[u]=t;
45 id[u]=++cnt;
46 rev[cnt]=u;
47 if(!son[u]) return ;
48 dfs2(son[u],t);
49 for(int i=head[u];i;i=nxt[i]){
50 int v=to[i];
51 if(v!=fa[u] && v!=son[u]) dfs2(v,v);
52 }
53 }
54
55 void pushup(int k){
56 tree[k].sum=tree[k<<1].sum+tree[k<<1|1].sum;
57 }
58
59 void build(int k,int l,int r){
60 tree[k].l=l;tree[k].r=r;
61 if(l==r) return ;
62 int mid=(l+r)>>1;
63 build(k<<1,l,mid);
64 build(k<<1|1,mid+1,r);
65 }
66
67 void change(int k,int x,int y){
68 if(tree[k].l==tree[k].r && tree[k].l==x){
69 tree[k].sum=y;
70 return ;
71 }
72 int mid=(tree[k].l+tree[k].r)>>1;
73 if(x<=mid) change(k<<1,x,y);
74 else change(k<<1|1,x,y);
75 pushup(k);
76 }
77
78 void query(int k,int l,int r){//查询线段树中[l,r]的和值
79 if(tree[k].l>=l && tree[k].r<=r){//找到该区间
80 Sum+=tree[k].sum;
81 return;
82 }
83 int mid=(tree[k].l+tree[k].r)>>1;
84 if(l<=mid) query(k<<1,l,r);
85 if(r>mid) query(k<<1|1,l,r);
86 }
87
88 void ask(int u,int v){
89 while(top[u]!=top[v]){
90 if(dep[top[u]]<dep[top[v]]) swap(u,v);
91 query(1,id[top[u]],id[u]);//这里是top,下面是son,可以画图模拟一下,验证其正确性
92 u=fa[top[u]];
93 }
94 if(u==v) return ;//边权化为点权,加上这一步很有必要,防止重复算
95 if(dep[u]>dep[v]) swap(u,v);
96 query(1,id[son[u]],id[v]);//注意是son[u]
97 }
98
99 int main(){
100 int n,q,s;
101 init();
102 scanf("%d%d%d",&n,&q,&s);
103 for(int i=1;i<n;i++){
104 scanf("%d%d%d",&a[i].u,&a[i].v,&a[i].w);
105 add(a[i].u,a[i].v); add(a[i].v,a[i].u);
106 }
107 dfs1(1,0);
108 dfs2(1,1);
109 build(1,1,cnt);//创建线段树
110 for(int i=1;i<n;i++){//边权转化为点权
111 if(dep[a[i].u]>dep[a[i].v])
112 swap(a[i].u,a[i].v);
113 change(1,id[a[i].v],a[i].w);
114 }
115 int opt,i,val,x;
116 while(q--){
117 scanf("%d",&opt);
118 if(opt){
119 scanf("%d%d",&i,&val);
120 change(1,id[a[i].v],val);//改变第i条边的值为val
121 }
122 else{
123 scanf("%d",&x);
124 Sum=0;
125 ask(s,x);//查询s->x路径上边权的和值
126 printf("%d\n",Sum);
127 s=x;//更新温迪的位置
128 }
129 }
130 return 0;
131 }
POJ2763 Housewife Wind (树链剖分)的更多相关文章
- POJ2763 Housewife Wind 树链剖分 边权
POJ2763 Housewife Wind 树链剖分 边权 传送门:http://poj.org/problem?id=2763 题意: n个点的,n-1条边,有边权 修改单边边权 询问 输出 当前 ...
- 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(树剖+线段树)
After their royal wedding, Jiajia and Wind hid away in XX Village, to enjoy their ordinary happy lif ...
- Housewife Wind(边权树链剖分)
Housewife Wind http://poj.org/problem?id=2763 Time Limit: 4000MS Memory Limit: 65536K Total Submis ...
- POJ.2763 Housewife Wind ( 边权树链剖分 线段树维护区间和 )
POJ.2763 Housewife Wind ( 边权树链剖分 线段树维护区间和 ) 题意分析 给出n个点,m个询问,和当前位置pos. 先给出n-1条边,u->v以及边权w. 然后有m个询问 ...
- POJ 2763:Housewife Wind(树链剖分)
http://poj.org/problem?id=2763 题意:给出 n 个点, n-1 条带权边, 询问是询问 s 到 v 的权值, 修改是修改存储时候的第 i 条边的权值. 思路:树链剖分之修 ...
随机推荐
- 题解【洛谷 P1246 编码】
题目 编码工作常被运用于密文或压缩传输.这里我们用一种最简单的编码方式进行编码:把一些有规律的单词编成数宇. 字母表中共有 \(26\) 个字母 \(\{\tt a,b,\cdots,z\}\),这些 ...
- SpringBoot定时任务 - 集成quartz实现定时任务(单实例和分布式两种方式)
最为常用定时任务框架是Quartz,并且Spring也集成了Quartz的框架,Quartz不仅支持单实例方式还支持分布式方式.本文主要介绍Quartz,基础的Quartz的集成案例本,以及实现基于数 ...
- 关于又拍云免费cdn全网加速服务的长期评测(各种踩坑)
原文转载自「刘悦的技术博客」 ( https://v3u.cn/a_id_128 ) 妇孺皆知,前端优化中最重要的优化手段之一就是cdn加速,所谓cdn加速就是采用更多的缓存服务器(CDN边缘节点), ...
- 在阿里云Centos7.6上利用docker搭建Jenkins来自动化部署Django项目
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_84 一般情况下,将一个项目部署到生产环境的流程如下: 需求分析-原型设计-开发代码-内网部署-提交测试-确认上线-备份数据-外网更 ...
- Java面试题(二)--MySQL
1 存储引擎 1.简单描述一个Mysql的内部结构? MySQL的基本架构示意图: 大体来说,MySQL可以分为server层和存储引擎层两部分. ① server层包括连接器.查询缓存.分析器.优化 ...
- 一些有用的数学知识(Updating)
文章目录 拉格朗日插值公式 微分中值定理 费马引理 拉格朗日中值定理 柯西中值定理 洛必达法则 连分数(NOI2021 D2T2 考点) 定义 结论 定理1 定理2 定理3 定理4 定理5 欧拉公式 ...
- Spring 10: AspectJ框架 + @Before前置通知
AspectJ框架 概述 AspectJ是一个优秀的面向切面编程的框架,他扩展了java语言,提供了强大的切面实现 本身是java语言开发的,可以对java语言面向切面编程进行无缝扩展 AOP常见术语 ...
- Spring 14: Spring + MyBatis初步整合开发
SM整合步骤 预期项目结构 新建数据库和数据表 springuser.sql脚本如下 create database ssm; use ssm; create table users( userid ...
- 「学习笔记」斜率优化dp
目录 算法 例题 任务安排 题意 思路 代码 [SDOI2012]任务安排 题意 思路 代码 任务安排 再改 题意 思路 练习题 [HNOI2008]玩具装箱 思路 代码 [APIO2010]特别行动 ...
- 窗口部件-基础窗口部件 QWidget
1 基础窗口部件 QWidget QWidget 类是所有用户界面对象的基类,被称为基础窗口部件.不多废话直接看代码 main.cpp 如下 #include<QtWidgets> int ...