1146: [CTSC2008]网络管理Network
Time Limit: 50 Sec Memory Limit: 162 MBSubmit: 3641 Solved: 1076
[Submit][Status][Discuss]
Description
M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门。为了让分布在世界各地的N个
部门之间协同工作,公司搭建了一个连接整个公司的通信网络。该网络的结构由N个路由器和N-1条高速光缆组成。
每个部门都有一个专属的路由器,部门局域网内的所有机器都联向这个路由器,然后再通过这个通信子网与其他部
门进行通信联络。该网络结构保证网络中的任意两个路由器之间都存在一条直接或间接路径以进行通信。 高速光
缆的数据传输速度非常快,以至于利用光缆传输的延迟时间可以忽略。但是由于路由器老化,在这些路由器上进行
数据交换会带来很大的延迟。而两个路由器之间的通信延迟时间则与这两个路由器通信路径上所有路由器中最大的
交换延迟时间有关。作为M公司网络部门的一名实习员工,现在要求你编写一个简单的程序来监视公司的网络状况
。该程序能够随时更新网络状况的变化信息(路由器数据交换延迟时间的变化),并且根据询问给出两个路由器通
信路径上延迟第k大的路由器的延迟时间。【任务】 你的程序从输入文件中读入N个路由器和N-1条光缆的连接信息
,每个路由器初始的数据交换延迟时间Ti,以及Q条询问(或状态改变)的信息。并依次处理这Q条询问信息,它们
可能是: 1. 由于更新了设备,或者设备出现新的故障,使得某个路由器的数据交换延迟时间发生了变化。 2. 查
询某两个路由器a和b之间的路径上延迟第k大的路由器的延迟时间。
Input
第一行为两个整数N和Q,分别表示路由器总数和询问的总数。第二行有N个整数,第i个数表示编号为i的路由
器初始的数据延迟时间Ti。紧接着N-1行,每行包含两个整数x和y。表示有一条光缆连接路由器x和路由器y。紧接
着是Q行,每行三个整数k、a、b。如果k=0,则表示路由器a的状态发生了变化,它的数据交换延迟时间由Ta变为b
。如果k>0,则表示询问a到b的路径上所经过的所有路由器(包括a和b)中延迟第k大的路由器的延迟时间。注意N
,Q<=80000,任意一个路由器在任何时刻都满足延迟时间小于10^8。对于所有询问满足0<=K<=N
Output
对于每一个第二种询问(k>0),输出一行。包含一个整数为相应的延迟时间。如果路径上的路由器不足k个,
则输出信息“invalid request!”(全部小写不包含引号,两个单词之间有一个空格)。
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
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!
2
2
invalid request!
题解
非常裸的整体二分……只有我这种sb才有可能写WA……当然套个数据结构写也没什么问题……
【无论是整体二分还是数据结构】上树的时候可以树剖,但是如果用dfs序会降个log,也要好写很多。
我WA是因为把第k大看成第k小了【捂脸】太丢人了……
1 {$S-}{$R-}{$I-}{$V-} 2 program j01; 3 const maxn=80086; 4 type xx=record x,y,lc,id,tp,k:longint; end; 5 var a:array[0..maxn]of longint; 6 op,tmp1,tmp2:array[0..10*maxn]of xx; 7 c:array[0..2*maxn]of longint; 8 fir,ed,dep:array[0..maxn]of longint; 9 fa:array[0..maxn,0..20]of longint; 10 q,next:array[0..2*maxn]of longint; 11 head:array[0..maxn]of longint; 12 bin:array[0..maxn]of longint; 13 ans:array[0..maxn]of longint; 14 n,m,tt,tot,k,u,v,i,cnt,mn,mx,tmp:longint; 15 16 function min(a,b:longint):longint; 17 begin 18 if a<b then exit(a) else exit(b); 19 end; 20 21 function max(a,b:longint):longint; 22 begin 23 if a>b then exit(a) else exit(b); 24 end; 25 26 procedure swap(var a,b:longint);inline; 27 var c:longint; 28 begin 29 c:=a;a:=b;b:=c; 30 end; 31 32 procedure add(u,v:longint);inline; 33 begin 34 inc(tt);q[tt]:=v;next[tt]:=head[u];head[u]:=tt; 35 end; 36 37 procedure dfs(i:longint); 38 var j:longint; 39 begin 40 for j:=1 to bin[dep[i]] do 41 fa[i,j]:=fa[fa[i,j-1],j-1]; 42 inc(tot);fir[i]:=tot; 43 j:=head[i]; 44 while j>0 do 45 begin 46 if q[j]<>fa[i,0] then 47 begin 48 fa[q[j],0]:=i;dep[q[j]]:=dep[i]+1; 49 dfs(q[j]); 50 end; 51 j:=next[j]; 52 end; 53 inc(tot);ed[i]:=tot; 54 end; 55 56 function lca(u,v:longint):longint; 57 var d,i:longint; 58 begin 59 if u=v then exit(u); 60 if dep[u]<dep[v] then swap(u,v); 61 d:=dep[u]-dep[v]; 62 for i:=0 to bin[d] do 63 if d and(1 shl i)>0 then u:=fa[u,i]; 64 for i:=bin[dep[v]] downto 0 do 65 if fa[u,i]<>fa[v,i] then 66 begin 67 u:=fa[u,i];v:=fa[v,i]; 68 end; 69 if u=v then exit(u) else exit(fa[u,i]); 70 end; 71 72 procedure push(a,b,c:longint); 73 begin 74 inc(cnt); 75 with op[cnt] do 76 begin 77 x:=a;y:=c;id:=b;tp:=0; 78 end; 79 mx:=max(mx,a);mn:=min(mn,a); 80 end; 81 82 procedure addd(i,dd:longint);inline; 83 begin 84 while i<=tot do 85 begin 86 inc(c[i],dd);inc(i,i and(-i)); 87 end; 88 end; 89 90 function sum(i:longint):longint;inline; 91 begin 92 sum:=0;if i=0 then exit(0); 93 while i>0 do 94 begin 95 sum:=sum+c[i];dec(i,i and(-i)); 96 end; 97 end; 98 99 function ask(a:xx):longint;inline; 100 begin 101 exit(sum(a.x)+sum(a.y)-sum(fir[a.lc])-sum(fir[fa[a.lc,0]])); 102 end; 103 104 procedure solve(ql,qr,l,r:longint); 105 var i,j,tmp,lt,rt,mid:longint; 106 begin 107 if ql>qr then exit; 108 if l=r then 109 begin 110 for i:=ql to qr do 111 if op[i].tp=1 then ans[op[i].id]:=l; 112 exit; 113 end; 114 mid:=(l+r)div 2;lt:=0;rt:=0; 115 for i:=ql to qr do 116 if op[i].tp=0 then 117 begin 118 if op[i].x<=mid then 119 begin 120 addd(op[i].id,op[i].y);inc(lt);tmp1[lt]:=op[i]; 121 end else 122 begin 123 inc(rt);tmp2[rt]:=op[i]; 124 end; 125 end else 126 begin 127 tmp:=ask(op[i]); 128 if op[i].k<=tmp then 129 begin 130 inc(lt);tmp1[lt]:=op[i]; 131 end else 132 begin 133 dec(op[i].k,tmp);inc(rt);tmp2[rt]:=op[i]; 134 end; 135 end; 136 for i:=1 to lt do 137 if tmp1[i].tp=0 then addd(tmp1[i].id,-tmp1[i].y); 138 for i:=1 to lt do op[i+ql-1]:=tmp1[i]; 139 for i:=1 to rt do op[ql+lt+i-1]:=tmp2[i]; 140 solve(ql,ql+lt-1,l,mid); 141 solve(ql+lt,qr,mid+1,r); 142 end; 143 144 begin 145 readln(n,m); 146 mn:=maxlongint;mx:=0; 147 for i:=1 to n do read(a[i]); 148 fillchar(head,sizeof(head),0);tt:=0; 149 bin[1]:=0; 150 for i:=2 to n do 151 if i and(i-1)=0 then bin[i]:=bin[i-1]+1 else bin[i]:=bin[i-1]; 152 for i:=1 to n-1 do 153 begin 154 readln(u,v);add(u,v);add(v,u); 155 end; 156 tot:=0;fa[1,0]:=0;dep[1]:=0; 157 dfs(1); 158 cnt:=0; 159 for i:=1 to n do 160 begin 161 push(a[i],fir[i],1);push(a[i],ed[i],-1); 162 end; 163 for i:=1 to m do 164 begin 165 readln(k,u,v); 166 if k=0 then 167 begin 168 push(a[u],fir[u],-1);push(a[u],ed[u],1); 169 a[u]:=v; 170 push(a[u],fir[u],1);push(a[u],ed[u],-1); 171 ans[i]:=-2; 172 end else 173 begin 174 inc(cnt); 175 op[cnt].k:=k;op[cnt].x:=fir[u];op[cnt].y:=fir[v]; 176 op[cnt].lc:=lca(u,v);op[cnt].tp:=1;op[cnt].id:=i; 177 tmp:=dep[u]+dep[v]-2*dep[op[cnt].lc]+1; 178 if tmp<k then 179 begin 180 ans[i]:=-1;dec(cnt); 181 end else op[cnt].k:=tmp-op[cnt].k+1; 182 end; 183 end; 184 solve(1,cnt,mn,mx); 185 for i:=1 to m do 186 if ans[i]>-2 then 187 begin 188 if ans[i]=-1 then writeln('invalid request!') else writeln(ans[i]); 189 end; 190 end.