Network

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 1293    Accepted Submission(s): 575

Problem Description
The
ALPC company is now working on his own network system, which is
connecting all N ALPC department. To economize on spending, the backbone
network has only one router for each department, and N-1 optical fiber
in total to connect all routers.
The usual way to measure connecting
speed is lag, or network latency, referring the time taken for a sent
packet of data to be received at the other end.
Now the network is on
trial, and new photonic crystal fibers designed by ALPC42 is trying
out, the lag on fibers can be ignored. That means, lag happened when
message transport through the router. ALPC42 is trying to change routers
to make the network faster, now he want to know that, which router, in
any exactly time, between any pair of nodes, the K-th high latency is.
He needs your help.
 
Input
There are only one test case in input file.
Your
program is able to get the information of N routers and N-1 fiber
connections from input, and Q questions for two condition: 1. For some
reason, the latency of one router changed. 2. Querying the K-th longest
lag router between two routers.
For each data case, two integers N and Q for first line. 0<=N<=80000, 0<=Q<=30000.
Then n integers in second line refer to the latency of each router in the very beginning.
Then N-1 lines followed, contains two integers x and y for each, telling there is a fiber connect router x and router y.
Then
q lines followed to describe questions, three numbers k, a, b for each
line. If k=0, Telling the latency of router a, Ta changed to b; if
k>0, asking the latency of the k-th longest lag router between a and b
(include router a and b). 0<=b<100000000.
A blank line follows after each case.
 
Output
For
each question k>0, print a line to answer the latency time. Once
there are less than k routers in the way, print "invalid request!"
instead.
 
Sample Input
5 5
5 1 2 3 4
3 1
2 1
4 3
5 3
2 4 5
0 1 2
2 2 3
2 1 4
3 3 5
 
Sample Output
3
2
2
invalid request!
 
Source
 
Recommend
lcy   |   We have carefully selected several similar problems for you:  3071 3070 3072 3073 3074 
 
 
找树上两个点路径上的第k大节点
根据lca分别从起点和终点网上找点权,记下来,排序
lca预处理nlogn  lca查询logn  找路径 logn(n个节点的树最多logn层) 排序logn * logn
因此总复杂度(m + n)log^2n
不会超时
 
#include <cstdio>
#include <cstring>
#include <iostream>
#include <cstdlib>
#include <algorithm>
inline void read(int &x){char ch = getchar();char c = ch;x = 0;while(ch < '0' || ch > '9')c = ch, ch = getchar();while(ch <= '9' && ch >= '0')x = x * 10 + ch - '0', ch = getchar();if(c == '-')x = -x;}
inline void swap(int &a, int &b){int tmp = a;a = b;b = tmp;} const int MAXN = 80000 + 10; struct Edge{int u,v,next;}edge[MAXN << 1];
int head[MAXN],cnt,n,m,w[MAXN],p[20][MAXN],deep[MAXN],fa[MAXN],num[MAXN],b[MAXN];
inline void insert(int a,int b){edge[++cnt] = Edge{a, b, head[a]},head[a] = cnt;} int llog2[MAXN],pow2[30]; void dfs(int u)
{
for(int pos = head[u];pos;pos = edge[pos].next)
{
int v = edge[pos].v;
if(b[v])continue;
b[v] = true,deep[v] = deep[u] + 1,p[0][v] = u,fa[v] = u,dfs(v);
}
} inline void yuchuli()
{
b[1] = true,deep[1] = 0,dfs(1);
register int i;
for(i = 1;i <= llog2[n];i ++)
for(int j = n;j >= 1;j --)
p[i][j] = p[i - 1][p[i - 1][j]];
} inline int lca(int va, int vb)
{
register int i;
if(deep[va] < deep[vb])swap(va, vb);
for(i = llog2[n];i >= 0;i --)
if(deep[va] - pow2[i] >= deep[vb])
va = p[i][va];
if(va == vb)return va;
for(i = llog2[n];i >= 0;i --)
if(p[i][va] != p[i][vb])
va = p[i][va],vb = p[i][vb];
return p[0][va];
} int ans[MAXN],rank; inline void work(int s, int t, int k)
{
int anc = lca(s, t);
int now = s;
register int i = 1;
num[i] = w[now];
while(now != anc)
num[++i] = w[(now = fa[now])];
now = t;
while(now != anc)
num[++i] = w[now], now = fa[now];
std::sort(num + 1, num + 1 + i);
if(i >= k)
ans[++rank] = num[i - k + 1];
else rank++;
} int main()
{
register int i,tmp1,tmp2,tmp3;
llog2[0] = -1,pow2[0] = 1;
for(int i = 1;i <= MAXN;i ++)llog2[i] = llog2[i >> 1] + 1;
for(int i = 1;i <= 25; i++)pow2[i] = (pow2[i - 1] << 1);
read(n),read(m);
for(i = 1;i <= n;i ++)read(w[i]);
for(i = 1;i < n;i ++)read(tmp1),read(tmp2),insert(tmp1, tmp2),insert(tmp2, tmp1);
yuchuli();
for(i = 1;i <= m;i ++)
{
read(tmp1),read(tmp2),read(tmp3);
if(tmp1)work(tmp2, tmp3, tmp1);
else w[tmp2] = tmp3;
}
for(int i = 1;i < rank;i ++)
if(ans[i])
printf("%d\n", ans[i]);
else
printf("invalid request!\n");
if(ans[rank])
printf("%d\n", ans[rank]);
else
printf("invalid request!\n");
return 0;
}

HDU3078 Network [2016年6月计划 树上问题05]的更多相关文章

  1. 洛谷P2912 [USACO08OCT]牧场散步Pasture Walking [2017年7月计划 树上问题 01]

    P2912 [USACO08OCT]牧场散步Pasture Walking 题目描述 The N cows (2 <= N <= 1,000) conveniently numbered ...

  2. ZOJ3195 Design the city [2017年6月计划 树上问题04]

    Design the city Time Limit: 1 Second      Memory Limit: 32768 KB Cerror is the mayor of city HangZho ...

  3. HDU3887 Counting Offspring [2017年6月计划 树上问题03]

    Counting Offspring Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  4. 洛谷P3459 [POI2007]MEG-Megalopolis [2017年6月计划 树上问题02]

    [POI2007]MEG-Megalopolis 题目描述 Byteotia has been eventually touched by globalisation, and so has Byte ...

  5. 2016年12月31日 星期六 --出埃及记 Exodus 21:26

    2016年12月31日 星期六 --出埃及记 Exodus 21:26 "If a man hits a manservant or maidservant in the eye and d ...

  6. 2016年12月30日 星期五 --出埃及记 Exodus 21:25

    2016年12月30日 星期五 --出埃及记 Exodus 21:25 burn for burn, wound for wound, bruise for bruise.以烙还烙,以伤还伤,以打还打 ...

  7. 2016年12月29日 星期四 --出埃及记 Exodus 21:24

    2016年12月29日 星期四 --出埃及记 Exodus 21:24 eye for eye, tooth for tooth, hand for hand, foot for foot,以眼还眼, ...

  8. 2016年12月28日 星期三 --出埃及记 Exodus 21:23

    2016年12月28日 星期三 --出埃及记 Exodus 21:23 But if there is serious injury, you are to take life for life,若有 ...

  9. 2016年12月27日 星期二 --出埃及记 Exodus 21:22

    2016年12月27日 星期二 --出埃及记 Exodus 21:22 "If men who are fighting hit a pregnant woman and she gives ...

随机推荐

  1. echarts高级

    常用,待续... ♣tooltip自动轮播 ♣ 实现数据自动轮播 原理:其实就是timeline,获取某几段(时间)的数据,然后隐藏timeline ♣ legend自动轮播 ♣ 左侧多字出省略号 f ...

  2. 菜鸟nginx源码剖析数据结构篇(一)动态数组ngx_array_t[转]

    菜鸟nginx源码剖析数据结构篇(一)动态数组ngx_array_t Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.csdn ...

  3. opencv-图像类型、深度、通道

    转自:图像类型   与  opencv中图像基础(大小,深度,通道) 一.图像基本类型 在计算机中,按照颜色和灰度的多少可以将图像分为四种基本类型. 1. 二值图像 2. 灰度图像 3. 索引图像 4 ...

  4. System.Web.Mvc.ViewEngineResult.cs

    ylbtech-System.Web.Mvc.ViewEngineResult.cs 1.程序集 System.Web.Mvc, Version=5.2.3.0, Culture=neutral, P ...

  5. <input> type 属性

    单行文本域 语法格式:<input  type = “text” 属性 = “值” /> 常用属性 1  name:文本框的名字.命名规则是:可以包含字母.数字.下划线,只能以字母开头. ...

  6. Js中获取时间 new date()的用法

    Js中获取时间 new date()的用法 获取时间: var myDate = new Date();//获取系统当前时间 myDate.getYear(); //获取当前年份(2位) myDate ...

  7. extern关键字及C\C++相互调用

    extern关键字主要修饰变量或函数,表示该函数可以跨文件访问,或者表明该变量在其他文件定义,在此处引用. 1.extern修饰变量 (1)如果某变量int m在a.c中定义声明,则其他b.c文件访问 ...

  8. ubuntu触摸板失效问题

    很早便遇到这个问题,今天忍无可忍才度娘了一发.亲测有效! 用Ubuntu Tweak备份过桌面的配置,因此我尝试恢复桌面设置,果然奇迹发生了,触摸板立刻恢复了正常使用! 没有备份过的相信使用其中的重置 ...

  9. jeecms技术预研

      版权声明:本文版权归云焰所有,转载请注明. https://blog.csdn.net/yan_dk/article/details/27874461 1    Jeecms框架 1.1      ...

  10. PAT甲级——A1062 Talent and Virtue

    About 900 years ago, a Chinese philosopher Sima Guang wrote a history book in which he talked about ...