【2022寒假基础集训】第二场 - G.小沙的身法【树上差分+LCA】
Date:2022.04.28
题目描述
小沙发现他打球打不赢别人,打架也打不赢别人,所以他去了少林寺学习身法,以求打球的时候可以跑的更快,打架的时候也可以跑的更快(bushi)。
少林寺的方丈告诉小沙,他这种情况可以练习跳木桩,少林寺的一共有n个木桩,为了锻炼打球时的步伐,方丈严格限制的小沙的可移动路线,他规定小沙一定要按照他制定的方案来训练,否则小沙就会被方丈制裁。
小沙发现 方丈制定的路线是一个以一个点扩散开的树形结构,而小沙就需要在这一个树形结构上跳来跳去。由于两个木桩之间的间隔特别特别远,所以每次跳跃都只能在相邻的木桩之间移动。
以地面高度为例,如果地面的高度都视为0(平地),木桩的高度不一,我们视每个木桩高度为 a i a_i ai,小沙每次从低处跳向高处都会消耗两地高度之差的体力,但是从高的跳向低的则不消耗体力。
小沙练习了许久,终于熟能生巧了。
于是他叫来了师傅,想要给师傅秀一吧。
师傅便给了他m个考验 每个考验师傅都要他从地面上跳上指定的uu节点,然后最快速的速度跳向vv节点,然后回到地面,小沙心中也没底所以想问你他至少需要多少体力才能把这个考验完成。
每个考验均相互独立,小沙的体力不会受到上一次考验的影响。
输入描述:
首先输入两个整数 1 ≤ n ≤ 1 0 6 , 1 ≤ m ≤ 1 0 5 1\leq n \leq 10^6 ,1\leq m \leq 10^5 1≤n≤106,1≤m≤105
分别代表木桩个数以及师傅的考验个数
第二行输入n个数字 代表第i号木桩的高度是 1 ≤ a i ≤ 1 0 9 1\leq a_i \leq 10^9 1≤ai≤109
随后n-1行 每行两个数字x,y 代表第x号木桩和第y号木桩中间有一条师傅允许经过的路径(双向的)
紧接着的 m行每行两个数字代表着 u节点前往v节点
输出描述:
对于每一个考验输出一行对应的答案
(每个考验均相互独立)
示例1
输入
5 3
1 2 3 4 5
1 3
2 4
3 5
5 2
1 5
1 2
4 2
输出
5
5
4
思路:随便找个根把树拎起来(我选的1号点)。
① u p [ i ] : up[i]: up[i]:点 i i i向上走到根的距离。
② d o w n [ i ] : down[i]: down[i]:根向下走到点 i i i的距离。
③ l c a ( i , j ) lca(i,j) lca(i,j)。
在求 l c a lca lca前,求每个点的深度 d e p [ i ] dep[i] dep[i]的同时用前缀和更新 u p [ i ] 、 d o w n [ i ] up[i]、down[i] up[i]、down[i]。
i 、 j i、j i、j的距离即为:
a [ x ] + u p [ i ] − u p [ l c a ( i , j ) ] + d o w n [ j ] − d o w n [ l c a ( i , j ) ] ; a[x]+up[i]-up[lca(i,j)]+down[j]-down[lca(i,j)]; a[x]+up[i]−up[lca(i,j)]+down[j]−down[lca(i,j)];【别忘了 平 地 − x 平地 - x 平地−x的距离为 a [ x ] a[x] a[x]】
代码如下:
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=2e6+10;
LL n,m,a[N],h[N],e[N],w[N],ne[N],idx;
LL dep[N/2],fa[N/2][23];
LL up[N],down[N];
void add(int x,int y) {e[idx]=y;ne[idx]=h[x];h[x]=idx++;}
void bfs()
{memset(dep,0x3f,sizeof dep);dep[0]=0;dep[1]=0;up[1]=0;down[1]=0;queue<int>q;q.push(1);while(q.size()){int t=q.front();q.pop();for(int i=h[t];i!=-1;i=ne[i]){int j=e[i];if(dep[j]>dep[t]+1){dep[j]=dep[t]+1;q.push(j);down[j]=down[t]+max((LL)0,a[j]-a[t]);up[j]=up[t]+max((LL)0,a[t]-a[j]);fa[j][0]=t;for(int k=1;k<=20;k++)fa[j][k]=fa[fa[j][k-1]][k-1];}}}
}
int lca(int a,int b)
{if(dep[a]<dep[b]) swap(a,b);for(int k=20;k>=0;k--)if(dep[fa[a][k]]>=dep[b]) a=fa[a][k];if(a==b) return a;for(int k=20;k>=0;k--)if(fa[a][k]!=fa[b][k]) {a=fa[a][k];b=fa[b][k];}return fa[a][0];
}
int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin>>n>>m;memset(h,-1,sizeof h);for(int i=1;i<=n;i++) cin>>a[i];for(int i=1;i<n;i++){int x,y;cin>>x>>y;add(x,y);add(y,x);}bfs();while(m--){int x,y;cin>>x>>y;int p=lca(x,y);cout<<up[x]+down[y]-up[p]-down[p]+a[x]<<'\n';//别忘了还有平地~x的花费}return 0;
}
【2022寒假基础集训】第二场 - G.小沙的身法【树上差分+LCA】相关推荐
- 2022牛客寒假算法基础集训营2 G.小沙的身法 LCA 树上前缀和
思路 注意模拟样例的时候不要把询问读成连边... LCA板题,维护树上前缀和,按照题目要求先跳到 u u u再跳到 v v v,再调到地上.向高处跳需要消耗高度差的体力,向低处跳不消耗体力. 那么需要 ...
- 【2022寒假基础集训】第二场 -LM.小沙的remake【BIT+DP】
Date:2022.03.12 题目描述: 小沙的人生充满坎坷,他现在准备remake,在新的人生中他想要自己的人生一帆风顺,步步高升,所以他希望自己的气运不会下降,他的新的人生,活的时间可以不长,但 ...
- 【2022寒假基础集训】第二场 -L/M.小沙的remake【BIT+DP】
Date:2022.03.12 题目描述: 小沙的人生充满坎坷,他现在准备remake,在新的人生中他想要自己的人生一帆风顺,步步高升,所以他希望自己的气运不会下降,他的新的人生,活的时间可以不长,但 ...
- 【2022寒假基础集训】第一场 - B.炸鸡块君与FIFA22【倍增DP+集合分类】
Date:2022.04.27 题目描述: 热爱足球(仅限游戏)的炸鸡块君最近购买了FIFA22,并且沉迷于FIFA22的Rivals排位上分. 在该排位系统中,每局游戏可能有胜利(用W表示).失败( ...
- 题解报告(CDUT暑期集训——第二场)
题解报告(CDUT暑期集训--第二场) D - Game HDU - 6312 思路:水题 Alice一直是必胜态 AC代码 #include<stdio.h> #include<i ...
- ICPC网络赛第二场G Limit
ICPC网络赛第二场G Limit 题意: 给你数组a和b,求解: 1≤n≤100000,−100≤ai,bi≤100,0≤t≤5.1≤n≤100000,−100≤a_{i},b_{i}≤100,0≤ ...
- 2020集训第二场总结
题目在HDOJ:链接 心路历程 这是2020集训第二场,这场没新生,以为难度会提升,开局开了1000和1008,1000字量好多看1008,一眼就是双分数求最小公倍数,先约分,然后求公倍数. 一开始写 ...
- 2022牛客寒假第二场 小沙的身法 (思维,树上两点距离)
题目链接:点击这里 题目大意: 题目分析: 不难发现,此题是求树上两点的最近距离,此问题一般可以使用 d e p [ x ] + d e p [ y ] − 2 ⋅ d e p [ l c a ( x ...
- 牛客寒假算法基础集训营1 - C - 小a与星际探索(bfs || 暴力)
题目链接:https://ac.nowcoder.com/acm/contest/317/C 思路1:直接bfs. #include<bits/stdc++.h> using namesp ...
最新文章
- Java【快速排序、插入排序、简单选择排序...】【八大排序-综合实验】
- H264 视频文件 帧格式 传输封装等 杂碎
- react 消息订阅-发布机制(解决兄弟组件通信问题)
- java 输出当月日历_java 实现打印当前月份的日历
- 2019第一季度海外市场手机出货量报告:华为、小米逆势增长
- 【报告分享】2020年B站内容营销报告.pdf(附下载链接)
- 计算机网络常用术语WWW,计算机网络常用术语
- Confluence 6 配置草稿保存的时间
- 「中间件」消息中间件如何实现每秒几十万的高并发写入?
- Kubernetes监控体系(1)-cAdvisor介绍
- 【计算机视觉】exe视频转mp4、采集视频中图片记录、删除ABC看图王等软件
- ckplayer快速入门
- Vuex_Todos
- [精简]托福核心词汇37
- excel 第15讲:条件格式与公式
- 如何使用FFmpeg命令处理音视频
- 百万人同时在线直播的服务器,QQ游戏百万人同时在线的服务器架构实现
- CUDA:CUDA转OPENGL的实例
- pycharm申请学生账号收不到邮件问题(不是你收不到而是你没找到,邮件被拦截了)
- Python简笔画发射爱心
热门文章
- Java 3个常用工作流引擎
- Charlie Rose 访谈 Twitter CEO Evan Williams
- Revit技巧 | Revit中图元不可见怎么办?
- 逻辑斯蒂回归算法详解
- 张景明:方剂【方歌】——和解剂
- [Tensorflow] Ubuntu下NVIDIA Driver+CUDA+cuDNN 安装踩坑总结
- Linux动态链接库.so文件的创建与使用
- 27岁学python编程_五一4天就背这些Python面试题了,Python面试题No12
- UE5虚幻引擎5创建风格化的VFX游戏特效视频教程-Niagara和Substance Designer工作流
- 史上最易懂——ReactNative分组列表SectionList使用详情及示例详解