题意:一棵无根树,输入点数和操作数,下面一行n个值代表每个点的权。下面n-1行是树边

操作分为

0 x w ,表示把点x的权改为w

k a b , 求出,从a到b的路径中,第k大的点权

解题思路:这道题没什么特别难的地方,只需要找到两点的LCA,然后回溯上去把路径上所有的点都拿出来排序即可。在回溯的过程中,需要有一个记录该节点父亲节点的fa[]数组,在dfs遍历的时候可以直接把fa[]数组更新。。。

这题最开始想会不会是树链剖分,看来想多了。

这题用C++可以A,G++超时。。。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;const int maxn = 80005;
struct Edge
{int to,next;
}edge[maxn<<1];
int n,q,cnt,num,tot,pre[maxn],router[maxn],fa[maxn];
int dp[maxn<<1][20],ver[maxn<<1],R[maxn<<1],first[maxn],tmp[maxn];void addedge(int u,int v)
{edge[num].to = v;edge[num].next = pre[u];pre[u] = num++;
}void dfs(int u,int dep)
{ver[++cnt] = u; first[u] = cnt; R[cnt] = dep;for(int i = pre[u]; i != -1; i = edge[i].next){int v = edge[i].to;if(fa[u] == v) continue;fa[v] = u;dfs(v,dep+1);ver[++cnt] = u; R[cnt] = dep;}
}int _min(int l,int r)
{if(R[l] < R[r]) return l;return r;
}void initRMQ()
{for(int i = 1; i <= cnt; i++)dp[i][0] = i;for(int j = 1; (1 << j) <= cnt; j++)for(int i = 1; i + (1 << j) < cnt; i++){dp[i][j] = _min(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);}
}int findLCA(int l,int r)
{int k = (int)(log(r - l + 1.0) / log(2.0));return ver[_min(dp[l][k],dp[r-(1<<k)+1][k])];
}bool cmp(int a,int b)
{return a > b;
}int main()
{int k,a,b;while(scanf("%d%d",&n,&q)!=EOF){cnt = num = 0;memset(pre,-1,sizeof(pre));for(int i = 1; i <= n; i++)scanf("%d",&router[i]);for(int i = 1; i < n; i++){scanf("%d%d",&a,&b);addedge(a,b);addedge(b,a);}dfs(1,0);initRMQ();while(q--){scanf("%d%d%d",&k,&a,&b);if(k == 0)router[a] = b;else{int x = first[a], y = first[b];if(x > y) swap(x,y);int lca = findLCA(x,y);tot = 0;while(a != lca){tmp[++tot] = router[a];a = fa[a];}while(b != lca){tmp[++tot] = router[b];b = fa[b];}tmp[++tot] = router[lca];if(k > tot) printf("invalid request!\n");else{sort(tmp+1,tmp+1+tot,cmp);printf("%d\n",tmp[k]);}}}}return 0;
}

hdu 3078(LCA+排序)相关推荐

  1. HDU 4857 拓扑排序 优先队列

    n个数,已经有大小关系,现给m个约束,规定a在b之前,剩下的数要尽可能往前移.输出序列 大小关系显然使用拓扑结构,关键在于n个数本身就有大小关系,那么考虑反向建图,优先选择值最大的入度为零的点,这样得 ...

  2. 【HDU - 6203】ping ping ping(lca+贪心思想,对lca排序,树状数组差分)

    题干: 给出一个n+1个点的树,以及p个点对,需要断开一些点,使得这p个点对路径不连通.输出应该断开的最少点数. 解题报告: 从那p个点对入手的话:首先考虑只有一对点的话,肯定是这条路径上的随便一个点 ...

  3. HDU - 3078 Network 倍增LCA

    倍增lca,把路径上点全部拉出来拍个序输出第k大就过了. 不知道怎么过的,咱也不敢问. #include<stdio.h> #include<string.h> #includ ...

  4. hdu 1872(稳定排序)

    稳定排序就是相同元素排序后次序不会发生改变的排序方法. 冒泡是稳定排序. 快一点的归并也是稳定排序. 稳定排序 Time Limit: 3000/1000 MS (Java/Others)    Me ...

  5. hdu 1811(拓扑排序+并查集)

    解题思路: 拓扑排序的两个性质: ①如果一次入队入度为零的点大于1则说明拓扑排序序列不唯一 ②如果排序的总个数小于给定的个数,则说明存在回路 可以先把"="的两个数用并查集放在一个 ...

  6. hdu 4547(LCA+Tarjan)

    解题思路:很明显的LCA问题,用Tarjan离线算法即可.这里输入的可能是字符串,所以直接用map保存.此外,根据题意,这里需要稍稍有点变化,因为cd:a\b\c...这里是一步即可完成,所以在查询a ...

  7. hdu 2874(LCA + 节点间距离)

    解题思路:Tarjan离线处理 一篇介绍LCA的很好的博客:http://www.cppblog.com/menjitianya/archive/2015/12/10/212447.html #inc ...

  8. hdu 2586(LCA + 节点间距离)

    题意:给一棵树,询问u和v之间的边权和. 解题思路:找到u和v的最近公共祖先,它们之间的距离为dis[u]+dis[v]-2*dis[lca(u,v)] #include<iostream> ...

  9. hdu 2586(LCA的离线做法)

    lca上的tarjan,改了我一下午加一晚上的bug,还无奈重写了一次.就是寻找最近公共祖先lca(u,v #include <iostream> #include <cstring ...

最新文章

  1. echarts 自适应高度_web 报表工具如何自适应
  2. OpenCV中函数imread的参数flags的枚举值(可设置值)及其具体意义
  3. 【PAT甲级 - 1028】List Sorting (25分)(模拟,排序)
  4. ros::spin() 和 ros::spinOnce()
  5. cas修改界面html,为REST API配置的CAS将v1 / ticket重定向到登录HTML
  6. cad细等线体不显示_CAD技法大全,如何在CAD中解决好部分图元无法正常显示的问题 ?...
  7. select tables optimized away
  8. jdbc连接rac的oracle数据库
  9. git根据commit生成patch(转载)
  10. 电力拖动计算机控制系统讲什么,《电力拖动自动控制系统》教学大纲概要
  11. 【计算机基础】计算机分类
  12. Photoshop(PS)2021安装教程【64位】
  13. Adobe Acrobat XI Pro 11.x 安装指南
  14. Java实习生常规技术面试题每日十题Java基础(三)
  15. JGG | 河北大学杜会龙组综述植物泛基因组学研究
  16. 哈尔滨傲澜智伴机器人_智伴机器人品质保证(在线咨询),机器人
  17. ad20栅格_AD软件的3种栅格设置详解
  18. ArduinoMega2560 引脚表
  19. 浅谈数据中心综合布线运维管理方式发展史
  20. 数据库作业:相关概念的解释和理解

热门文章

  1. 神策数据与 UCloud 达成战略合作,开启高效企业服务新模式
  2. 技术分享 | 个性化推荐系统商业化的五大要素
  3. 前端要凉?微软开源Sketch2Code,草图秒变代码
  4. RxJS实践,Vue如何集成RxJS
  5. 5.16 Stacks and Queues
  6. 点滴积累【C#】---操作文件
  7. market layout
  8. Career Essentials Postgraduate Study: exploring your options 读完本科后干啥?
  9. spring boot 菜鸟教程学习:spring是一个超级大工厂能够管理java对象(bean)和他们之间的关系(依赖注入)
  10. 做事情的价值和看待方式