HDU 3078 Network LCA
题意: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的更多相关文章
- HDU 3078 Network(LCA dfs)
Network [题目链接]Network [题目类型]LCA dfs &题意: 给出n个点的权值,m条边,2种操作 0 u num,将第u个点的权值改成num k u v,询问u到v这条路上 ...
- hdu 3078 Network (暴力)+【LCA】
<题目链接> 题目大意:给定一颗带点权的树,进行两种操作,k=0,更改某一点的点权,k!=0,输出a~b路径之间权值第k大的点的点权. 解题分析:先通过RMQ的初始化,预处理pre[]数组 ...
- HDU - 3078 Network(暴力+LCA)
题目大意:给出n个点的权值.m条边,2种操作 0 u num,将第u个点的权值改成num k u v,询问u到v这条路上第k大的权值点 解题思路:该点的话直接该,找第k大的话直接暴力 #include ...
- HDU 3078 Network
简单的 RMQ: 先预处理得到 所有 节点的 公共祖先 和 dfs 得到所有节点的父亲节点: 然后 询问时,从自己出发向上找父亲, 然后 得到所有的节点:排序一下 不知道 这题这样也 ...
- HDU 2460 Network(双连通+树链剖分+线段树)
HDU 2460 Network 题目链接 题意:给定一个无向图,问每次增加一条边,问个图中还剩多少桥 思路:先双连通缩点,然后形成一棵树,每次增加一条边,相当于询问这两点路径上有多少条边,这个用树链 ...
- HDU 3078:Network(LCA之tarjan)
http://acm.hdu.edu.cn/showproblem.php?pid=3078 题意:给出n个点n-1条边m个询问,每个点有个权值,询问中有k,u,v,当k = 0的情况是将u的权值修改 ...
- HDU 3078 (LCA+树链第K大)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3078 题目大意:定点修改.查询树中任意一条树链上,第K大值. 解题思路: 先用离线Tarjan把每个 ...
- HDU 2460 Network(桥+LCA)
http://acm.hdu.edu.cn/showproblem.php?pid=2460 题意:给出图,求每次增加一条边后图中桥的数量. 思路: 先用tarjan算法找出图中所有的桥,如果lowv ...
- hdu 3078(LCA的在线算法)
Network Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...
随机推荐
- 通过css实现文本超出部分以省略号(......)代替
一.单行溢出 1,固定宽度(非常容易) text-overflow: ellipsis; 2,不固定宽度 思路:想让这个区域成为块元素,然后不换行,溢出隐藏. display: block; whit ...
- Codevs 1337 银行里的迷宫
1337 银行里的迷宫 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 传送门 题目描述 Description 楚楚每一次都在你的帮助下过了一关又一关(比如他开 ...
- ES的安装运行
一.安装,运行 1. 检查java的版本环境 Elasticsearch依赖Java,在书写本文档的时候,推荐使用Oracle JDK 1.8.0_20 或 1.7.0_55以后的版本. 在安装Ela ...
- umask默认权限分配
umask默认权限分配的命令 当我们登录系统之后创建一个文件总是有一个默认权限的,那么这个权限是怎么来的呢?这就是umask干的事情.umask设置了用户创建文件的默认 权限,它与chmod的效果刚好 ...
- JavaScript拖拽
<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta http-e ...
- 我也来玩玩WinForm~BeginInvoke让用户体验更好!
前言 先说明一下,本人不太做winform的项目,工作10年以来,一直奋斗在webform的舞台上,今天有机会也接触了一下winform,下面对工作中用到的BeginInvoke方法作一下说明,和大家 ...
- JavaScript学习总结【8】、面向对象编程
1.什么是面向对象编程 要理解面向对象,得先搞清楚什么是对象,首先需要明确一点这里所说的对象,不是生活中的搞男女朋友对象,面向对象就是面向着对象,换在代码中,就是一段代码相中了另一段代码,自此夜以继日 ...
- >炫酷的计时器效果Canvas绘图与动画<
>炫丽的计时器效果Canvas绘图与动画< 虽然我是学习java的,但是因为最近使用html5的关系,多学习了一下前端知识. 现在,我要介绍的计时器是十分炫酷的,使用画布完成. 喜欢htm ...
- 在 Sublime Text 3 中运行 PHP
参考http://segmentfault.com/blog/tony/1190000000395951 把php添加到环境变量 1.我的电脑->属性->高级系统设置->高级-> ...
- javascript 获取 class 样式 重新赋值class样式 为div等系列标签内更改内容
name = document.getElementById(project_not_through_id).className; // 获取目标id的 cla ...