题意:n个点 m个询问,下面一行是n 个点的权值 再下面n-1行是双向的边

然后m个询问:k u v 若k==0,则把u点的权值改为v,否则回答u->v之间最短路经过点的权值中  第k大的值是多少

木有AC。。勿扔OJ

可以拿来学习RMQ

思路:跑个RMQ  求出LCA(u,v) 然后只要登山坡一遍就得到u->v的点,记下这些点的权值,再排个序就有第k大的数了

下面附几个测试案例和答案

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define N 80010 //最多有N个点
struct node{
int from,to,nex;
}edge[N];
int head[N],edgenum;
int a[N],pre[N],temp[N];//a[]是点的权值,temp是用来记录登山坡经过的点的权值
//pre记录点的前驱,用来登山坡
int E[N*2],R[N],D[N*2],en;//R[i]代表i点第一次搜到的位置 E[i]代表搜的第i次点的编号 D[i]代表搜的第i次点的深度 void add(int u,int v){//邻接表
edge[edgenum].from=u; edge[edgenum].to=v;
edge[edgenum].nex=head[u]; head[u]=edgenum++;
}
void DFS(int x,int deep){
E[en]=x;D[en]=deep;R[x]=en++;
for(int i=head[x];i!=-1;i=edge[i].nex)
{
int v=edge[i].to;
if(R[v]==-1)
{
pre[v]=x;
DFS(v,deep+1);
E[en]=x; D[en++]=deep;
}
}
}
int LCA(int u,int v){
int deep=N,t=u;
if(R[u]>R[v]){t=u;u=v;v=t;}
for(int i=R[u];i<=R[v];i++)
if(deep>D[i])
deep=D[i],t=i;
return E[t];
} bool cmp(int a,int b){return a>b;}
void Findans(int u,int v,int k){
int lca=LCA(u,v),top=0; temp[top++]=a[lca]; for(;u!=lca;u=pre[u])temp[top++]=a[u];//登山坡到LCA处
for(;v!=lca;v=pre[v])temp[top++]=a[v]; if(top<k)printf("invalid request!\n");
else
{
sort(temp,temp+top,cmp);
printf("%d\n",temp[k-1]);
}
}
void Init(){
memset(head,-1,sizeof(head));
edgenum=0;
memset(R,-1,sizeof(R)); en=0;
memset(pre,-1,sizeof(pre));
//pre[1]=-1;
} int main(){
int u,v,n,m;//n个点,从1-n
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
Init();
while(--n)
{
scanf("%d %d",&u,&v);
add(u,v); add(v,u);//双向边
}
DFS(1,0);//建以1为根的树 此时深度为0
while(m--)//询问
{
int k; scanf("%d%d%d",&k,&u,&v);
if(k==0)a[u]=v;
else Findans(u,v,k);
}
return 0;
}
/*
8 99
5 2 3 4 5 6 7 8
1 3
1 2
3 4
3 5
5 6
5 7
7 8
1 2 8
2 2 8
3 2 8
4 2 8
5 2 8
6 2 8
7 2 8
1 4 8
4 2 3
5 3 8
2 3 8
0 3 8
2 3 8
3 3 8
2 4 5
1 4 1
2 4 1
3 4 1 ans:
8
7
5
5
3
2
in...
8
in...
in...
7
8
7
5
8
5
4 ////
1 1
5
1 1 1 ans:
5
////
2 2
2 1
1 2
2 2 1
1 1 2 ans:
1
2 11 3
1 2 3 4 5 6 7 8 9 10 11
1 4
1 3
2 1
4 5
6 4
3 7
2 9
10 2
10 11
7 8
3 11 8
3 11 9
5 10 5 ans:
8
9
1
////
4 99
1 2 3 4
2 1
3 1
4 1
1 2 4
2 2 4
3 2 4
4 2 4
0 1 100
1 2 4
2 2 4
3 2 4
4 2 4
1 3 3
1 3 1
2 3 1 ans:
4
2
1
in...
100
4
2
in...
3
100
3 //RMQ
//http://blog.csdn.net/liang5630/article/details/7917702
*/

HDU 3078 Network LCA的更多相关文章

  1. HDU 3078 Network(LCA dfs)

    Network [题目链接]Network [题目类型]LCA dfs &题意: 给出n个点的权值,m条边,2种操作 0 u num,将第u个点的权值改成num k u v,询问u到v这条路上 ...

  2. hdu 3078 Network (暴力)+【LCA】

    <题目链接> 题目大意:给定一颗带点权的树,进行两种操作,k=0,更改某一点的点权,k!=0,输出a~b路径之间权值第k大的点的点权. 解题分析:先通过RMQ的初始化,预处理pre[]数组 ...

  3. HDU - 3078 Network(暴力+LCA)

    题目大意:给出n个点的权值.m条边,2种操作 0 u num,将第u个点的权值改成num k u v,询问u到v这条路上第k大的权值点 解题思路:该点的话直接该,找第k大的话直接暴力 #include ...

  4. HDU 3078 Network

    简单的  RMQ:  先预处理得到  所有 节点的 公共祖先  和  dfs 得到所有节点的父亲节点:  然后  询问时,从自己出发向上找父亲, 然后  得到所有的节点:排序一下 不知道  这题这样也 ...

  5. HDU 2460 Network(双连通+树链剖分+线段树)

    HDU 2460 Network 题目链接 题意:给定一个无向图,问每次增加一条边,问个图中还剩多少桥 思路:先双连通缩点,然后形成一棵树,每次增加一条边,相当于询问这两点路径上有多少条边,这个用树链 ...

  6. HDU 3078:Network(LCA之tarjan)

    http://acm.hdu.edu.cn/showproblem.php?pid=3078 题意:给出n个点n-1条边m个询问,每个点有个权值,询问中有k,u,v,当k = 0的情况是将u的权值修改 ...

  7. HDU 3078 (LCA+树链第K大)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3078 题目大意:定点修改.查询树中任意一条树链上,第K大值. 解题思路: 先用离线Tarjan把每个 ...

  8. HDU 2460 Network(桥+LCA)

    http://acm.hdu.edu.cn/showproblem.php?pid=2460 题意:给出图,求每次增加一条边后图中桥的数量. 思路: 先用tarjan算法找出图中所有的桥,如果lowv ...

  9. hdu 3078(LCA的在线算法)

    Network Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

随机推荐

  1. 设置透明navigationBar

    三行代码轻松实现透明navigationBar:  [self.navigationController.navigationBar setBackgroundImage:[UIImage new] ...

  2. javascript 用函数实现“继承”

    一.知识储备: 1.枚举属性名称的函数: (1)for...in:可以在循环体中遍历对象中所有可枚举的属性(包括自有属性和继承属性) (2)Object.keys():返回数组(可枚举的自有属性) ( ...

  3. JavaScript 学习笔记之线程异步模型

    核心的javascript程序语言并没有包含任何的线程机制,客户端javascript程序也没有任何关于线程的定义,事件驱动模式下的javascript语言并不能实现同时执行,即不能同时执行两个及以上 ...

  4. 好用的自适应表格插件-bootstrap table (支持固定表头)

    最近工作中找到了一款十分好用的表格插件,不但支持分页,样式,搜索,事件等等表格插件常有的功能外,最主要的就是他自带的冻结表头功能,让开发制作表格十分容易,不过网上大多都是英文文档,第一次使用会比较麻烦 ...

  5. web系统

    现在的web系统已经越来越多的应用缓存技术,而且缓存技术确实是能实足的增强系统性能的.我在项目中也开始接触一些缓存的需求. 开始简单的就用jvm(java托管内存)来做缓存,这样对于单个应用服务器来说 ...

  6. Ext.Array 方法

    1. Ext.Array.clean(arr); 过滤数组中的空元素 var arr = [1,"",2,"",3]; Ext.clean(arr); // [ ...

  7. 2016022605 - redis订阅发布

    Redis的实现消息队列功能,消息发布者发送的消息,消息接收者接收发布者的消息.由该消息传送的链路被称为通道.在Redis客户端可以订阅任何数目的通道. 案例:给出一个客户端订阅一个通道名为redis ...

  8. TMS IntraWeb 5.4.1.1 for XE6 (适配Intraweb14.0.32)

    文件夹内含有我自己已经编译好的bpl,仅供大家学习使用,请支持正版!!导入ParaInstalarXE6.groupproj后,逐个编译安装即可. 链接:http://pan.baidu.com/s/ ...

  9. Junit4拓展工具JCategory与Testng的Group功能比较

    前言 笔者前段时间分享过一遍文章,关于如何通过引入新注解来扩展Junit4,以解决Process上的问题: JUnit扩展:引入新注解Annotation 最近在跟外面的同事聊的时候,得知Testng ...

  10. bzoj 3110: [Zjoi2013]K大数查询 树状数组套线段树

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1384  Solved: 629[Submit][Stat ...