zoukankan      html  css  js  c++  java
  • bzoj1146: [CTSC2008]网络管理Network

    1146: [CTSC2008]网络管理Network

    Time Limit: 50 Sec  Memory Limit: 162 MB
    Submit: 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

    Sample Output

    3
    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.
    View Code
  • 相关阅读:
    GoldenGate配置(一)之单向复制配置
    Qt4.8.6+mingw+Qgis2.4.0基于QGis的二次开发
    Linux用户及用户组设置
    HDU1013_Digital Roots【大数】【水题】
    随意一条查询sql转换为查询结果集相应的数目
    对文件地址的几种概念的理解
    2014-10深圳全球架构师峰会
    有沃更精彩,沃课堂理想的移动学习平台
    自己动手写CPU之第九阶段(8)——MIPS32中的LL、SC指令说明
    Inno Setup入门(二)——修改安装过程中的图片
  • 原文地址:https://www.cnblogs.com/oldjang/p/6471809.html
Copyright © 2011-2022 走看看