简单的  RMQ;  先预处理得到  所有 节点的 公共祖先  和  dfs 得到所有节点的父亲节点;  然后  询问时,从自己出发向上找父亲, 然后  得到所有的节点;排序一下

不知道  这题这样也能过;为什么不会超时啊???????????;

 #include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<stdio.h>
#include<vector>
using namespace std;
const int maxn = ;
struct date{
int v,next;
}edge[maxn<<]; int total,head[maxn];
int N,Q,node[maxn],fath[maxn];
void add_edge( int u,int v ){
edge[total].v = v;
edge[total].next = head[u];
head[u] = total++;
}
bool vis[maxn]; int dep[maxn<<],sta[maxn<<],tab[maxn<<],dp[maxn<<][],num;
void dfs1( int son,int fa ){
vis[son] = true; fath[son] = fa;
for( int i = head[son]; i != -; i = edge[i].next ){
int v = edge[i].v;
if( !vis[v] )dfs1( v,son );
}
}
void LCA( int son,int deep ){
dep[num] = deep; sta[son] = num; tab[num] = son; num++; vis[son] = true;
for( int i = head[son]; i != -; i = edge[i].next ){
int v = edge[i].v;
if( !vis[v] ){ LCA( v,deep+ ); dep[num] = deep; tab[num] = son; num++; }
}
}
int work( int n1,int n2 ){
if( dep[n1] < dep[n2] )return n1;
return n2;
}
void RMQ( ){
for( int i = ; i <= num; i++ )dp[i][] = i;
for( int i = ; (<<i) <= num; i++ ){
for( int j = ; j - + (<<i) <= num; j++ )
dp[j][i] = work( dp[j][i-], dp[j+(<<(i-))][i-] );
}
}
int query( int L,int R ){
int k = ;
while( (<<(k+)) <= R-L+ )k++;
return tab[work( dp[L][k],dp[R-(<<k)+][k] )];
}
vector<int>vv;
bool cmp( int a,int b ){
return a > b;
}
void DO( int u,int v,int fa,int k ){
vv.clear();
while( u != fa ){
vv.push_back( node[u] );
u = fath[u];
}
while( v != fa ){
vv.push_back( node[v] );
v = fath[v];
}
vv.push_back( node[fa] ); sort( vv.begin(),vv.end(),cmp );
//for( int i = 0; i < vv.size(); i++ )cout<<vv[i]<<endl;
if( vv.size() < k )puts("invalid request!");
else printf("%d\n",vv[k-]);
}
int main(){
while( scanf("%d%d",&N,&Q) != EOF ){
memset( head,-,sizeof(head) ); total = ;
for( int i = ; i <= N; i++ )fath[i] = i;
for( int i = ; i <= N; i++ )scanf("%d",&node[i]);
for( int i = ; i < N; i++ )
{
int u,v; scanf("%d%d",&u,&v);
add_edge( u,v );
add_edge( v,u );
}
memset( vis,,sizeof(vis) );
dfs1( ,- ); fath[] = ;
memset( vis,,sizeof(vis) );num = ;
LCA( , );
//for( int i = 1; i < num; i++ )
//cout<<i<<" "<<dep[i]<<" "<<tab[i]<<endl;
num--; RMQ( );
while( Q-- ){
int k,u,v; scanf("%d%d%d",&k,&u,&v);
if( k == ){ node[u] = v; continue; }
//cout<<node[4]<<endl;
if( sta[u] > sta[v] )swap( u,v );
//cout<<query( sta[u],sta[v] )<<endl;
DO( u,v,query( sta[u],sta[v] ),k );
}
}
return ;
}
/* 7 100
5 1 4 2 4 3 6
1 2
1 3
1 4
2 5
3 6
4 7 */

HDU 3078 Network的更多相关文章

  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

    题意:n个点 m个询问,下面一行是n 个点的权值 再下面n-1行是双向的边 然后m个询问:k u v 若k==0,则把u点的权值改为v,否则回答u->v之间最短路经过点的权值中  第k大的值是多 ...

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

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

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

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

  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. js 阻止冒泡 兼容性方法

    function customstopPropagation(e){ var ev = e || window.event; if (ev.stopPropagation) { ev.stopProp ...

  2. .NET Framework 框架简述01

    NET技术可以以规范和实现两部分来划分.   规范:   公共语言架构(Common Language Infrastructure, CLI),主要包括 1.通用类型系统(Common Type S ...

  3. 怎样强制QQ聊天

    首先复制下面这段网址: http://wp.qq.com/open_webaio.html?sigt=2d3bb7d31517da8c94a1061c6b63dd3203eb633805dcd09ec ...

  4. struts.properties的参数描述

    A.2.1 概述 如果我们希望覆盖在default.properties文件里面定义的默认配置,那就可以定义struts.properties文件,在里面设置我们需要的值,当然现在也可以在struts ...

  5. Linux搜狗输入法在有道云笔记上输入冗余

    Linux下,在有道云笔记中用搜狗拼音输入法时,会出现输入冗余,类似于输入法的缓冲上屏了.这是有道云笔记Web页面的问题. 暂时的解决办法是按Ctrl + alt + p. 不仅搜狗输入法,凡是用fc ...

  6. lintcode:买卖股票的最佳时机 IV

    买卖股票的最佳时机 IV 假设你有一个数组,它的第i个元素是一支给定的股票在第i天的价格. 设计一个算法来找到最大的利润.你最多可以完成 k 笔交易. 注意事项 你不可以同时参与多笔交易(你必须在再次 ...

  7. sql server2008禁用远程连接

    1.打开SQL Server 配置管理器,双击左边 SQL Server 网络配置,点击TCP/IP协议,在协议一栏中,找到 全部侦听,修改为否,然后点击IP地址,将IP地址为127.0.0.1(IP ...

  8. React组件-mixin

    一.组件 二.代码 <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset=&q ...

  9. 针对安卓java入门:数据类型

    基本数据类型: 布尔型----boolean字符型----char 用单引号整数型----byte(字节型),short(短整型),int(整型),long(长整型)浮点数型--float(浮点型), ...

  10. iOS中检测硬件和传感器

    首先要知道,你需要查看所需的硬件或传感器是否存在,而不是假设设备有哪些功能.举个例子,你不能假设只有iPhone才有麦克风,而应该使用API来查看麦克风是否存在.下面这段代码的第一个优势在于,它能自动 ...