牛客网

时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Format:
%lld

题目描述 有一个树状的城市网络(即 n 个城市由 n-1 条道路连接的连通图),首都为 1 号城市,每个城市售卖价值为 a_i 的珠宝。
你是一个珠宝商,现在安排有 q 次行程,每次行程为从 u 号城市前往 v 号城市(走最短路径),保证 v 在 u 前往首都的最短路径上。
在每次行程开始时,你手上有价值为 c 的珠宝(每次行程可能不同),并且每经过一个城市时(包括 u 和 v
),假如那个城市中售卖的珠宝比你现在手上的每一种珠宝都要优秀(价值更高,即严格大于),那么你就会选择购入。
现在你想要对每一次行程,求出会进行多少次购买事件。

输入描述:

第一行,两个正整数 n , q (2 ≤ n ≤ 105 , 1 ≤ q ≤ 105)。 第二行,n 个正整数 a_i (1 ≤
a_i ≤ 10^5) 描述每个城市售卖的珠宝的价值。 接下来 n-1 行,每行描述一条道路 x , y (1 ≤ x,y ≤
n),表示有一条连接 x 和 y 的道路。 接下来 q 行,每行描述一次行程 u , v , c (1 ≤ u,v ≤ n , 1 ≤ c
≤ 105)。

输出描述:

对于每次行程输出一行,为所购买次数。

示例1
输入

5 4
3 5 1 2 4
1 2
1 3
2 4
3 5
4 2 1
4 2 2
4 2 3
5 1 5

输出

2
1
1
0

题解:
毋庸置疑就是用倍增来做
那什么是倍增呢?
(先挖个坑,有空做个倍增的讲解)
递推式fa[i][j] = fa[fa[i][j-1]][j - 1],只要倍增得到fa[i][0]就行,因为有了这个后面都可以推出
fa[i][j] 代表i节点往上走2^j的距离,且比当前大的点
每次查询时,在所有需要问的点加一条新点,连在u的下方,新点的权值就是询问的初始权值,从这个新点往上倍增就可以了

#include<bits/stdc++.h>
#include<vector>
const int maxn=2e5+2;
using namespace std;
int a[maxn];
int dis[maxn];
int fa[maxn][23];
int n,q;
int to[maxn];
vector<int> W[2*maxn];
void dfs(int u,int f)
{int pos=f;for(int i=21;i>=0;i--){if(fa[pos][i]&&a[fa[pos][i]]<=a[u])pos=fa[pos][i];}if(a[pos]>a[u])fa[u][0]=f;else fa[u][0]=fa[pos][0];for(int i=1;fa[fa[u][i-1]][i-1];i++){fa[u][i]=fa[fa[u][i-1]][i-1];}dis[u]=dis[f]+1;for(int v=0;v<W[u].size();v++){if(W[u][v]==f)continue;dfs(W[u][v],u);}
}
int main()
{cin>>n>>q;for(int i = 1; i <= n; ++i) {scanf("%d",&a[i]);}for(int i = 1; i < n; ++i) {int a;int b;scanf("%d%d",&a,&b);W[a].push_back(b);W[b].push_back(a);}for(int i =1; i <= q ; ++i){//增加新点int aa,b,c;scanf("%d%d%d",&aa,&b,&c);W[n+i].push_back(aa);W[aa].push_back(i+n);a[n+i] = c;to[n+i] = b;}dfs(1,0);int sum = 0; int pos;for(int i = n+1; i <= n+q; ++i){pos=i;sum=0;for(int j = 21; j >= 0; --j){if(dis[fa[pos][j]] >= dis[to[i]]) {sum += (1 << j);pos= fa[pos][j];}}printf("%d\n",sum);}return 0;}

牛客每日一题3.31 城市网络 树上倍增相关推荐

  1. 力扣牛客每日刷题(Python解法持续更新)

    力扣牛客每日刷题(持续更新) 初试结束第15天, 之前简单的处理了部分毕设方面的任务, 对接下来的学习做了个简单的规划 决定每天开始刷几道力扣题提高一下算法的理解,不能让之前学的数据结构都忘记了 每道 ...

  2. 【牛客每日一题】4.16 逆序对 ( 数学 , 排列组合 ,快速幂 , 快速乘 )

    [每日一题]逆序对 链接:https://ac.nowcoder.com/acm/problem/14731 来源:牛客网 题目描述 求所有长度为n的01串中满足如下条件的二元组个数: 设第i位和第j ...

  3. 【牛客每日一题】4.15 Treepath 题解(树上dfs/树形DP)

    题目链接:https://ac.nowcoder.com/acm/problem/14248 来源:牛客网 题目描述 给定一棵n个点的树,问其中有多少条长度为偶数的路径.路径的长度为经过的边的条数.x ...

  4. 【牛客每日一题】 4.13 Xorto(前缀异或和,枚举优化/映射)

    链接:https://ac.nowcoder.com/acm/problem/14247 来源:牛客网 题目描述 给定一个长度为n的整数数组,问有多少对互不重叠的非空区间,使得两个区间内的数的异或和为 ...

  5. 【牛客每日一题】tokitsukaze and Soldier 题目精讲 贪心、优先队列、堆

    链接:https://ac.nowcoder.com/acm/problem/50439 来源:牛客网 ACM在线模板 今天才发现牛客推出了一个每日一题的版块,3月25号就开始了,今天才发现,赶紧补救 ...

  6. 牛客每日一题系列(持续更新)

    均由Java实现 题目 奇数位上都是奇数位或偶数位上都是偶数位 有假币 最难的问题 因子个数 分解因数 斐波那契凤尾 剪花布条 客似云来 收件人列表 养兔子 年会抽奖 数据库连接池 mkdir 发邮件 ...

  7. 数学考试(牛客每日一题)变形一

    题意 给一个长度为n的区间,找两个不相交的区间,区间的长度不确定. 思路 这个题和数学考试那一题唯一不同的是区间的长度不确定了. 在数学考试那个题中,我们是记录了一个maxn[i] 来表示i~n中的区 ...

  8. (牛客每日一题)[SHOI2008]小约翰的游戏JOHN(Anti-Nim)

    这是一道裸Anti-Nim游戏 先手必胜条件(满足下面两个其中一个就行): *每一块石子的数量都为1,且总SG值为0时 *至少有一块石子的数量大于1,且 总SG值不为0时 #include <b ...

  9. 『牛客|每日一题』走迷宫

    ​ 活动地址:CSDN21天学习挑战赛

最新文章

  1. 02-dispatch_barrier
  2. 2019年人工智能行业又进入冬天了吗?
  3. 4.Android loader详解___回调
  4. Paper Reading: Papers in Frontiers of NLP 2018 collection
  5. Missing artifact com.microsoft.sqlserver:sqljdbc4:jar:4.0
  6. [EF4] CompiledQuery预编译性能提升 + 数据载入之大彻大悟
  7. SAP UI5 Library Resource Bundle 的设计原理
  8. Apache Digester示例–轻松配置
  9. python的stack用法_Python numpy.stack函数方法的使用
  10. 南加州大学等开源元学习研究库learn2learn
  11. 千头万绪:从一道面试题看数据库性能和安全的方方面面
  12. cuda安装(cuda安装教程)
  13. 博客园博客使用无觅插件
  14. 受贿千万,字节前餐饮主管二审被判6年
  15. 2017中国十大富豪排行榜
  16. Excel常用技巧(一)——快捷键
  17. 陀螺产业区块链第九季 | 如何用区块链搭建营销激励模型?
  18. Java--文件(File)
  19. axios拦截器作用及工作流程详解
  20. 以下不属于C语言字符集的为,c语言第1章练习题答案

热门文章

  1. 不同国家的视力表也不一样!| 今日趣图
  2. MATLAB图像处理与数字信号处理资料分享来袭
  3. 推荐系统相关算法(1):SVD
  4. java中统计括号配对_括号配对问题(C语言或JAVA语言代码)
  5. php 中 t怎么打开,怎么在PHP项目中实现一个explort() 功能
  6. Java开发之上班摸鱼!写最少的代码!
  7. java bouncycastle_java – 使用bouncycastle进行签名和验证签名的正确方法
  8. 计算机二级链表,计算机二级c语言上机考试——结构体与链表(3页)-原创力文档...
  9. leetcode1047. 删除字符串中的所有相邻重复项
  10. JAVA 手撕底层arrayList代码(arrayList的简单实现)