題目描述
m 公司是乙個非常龐大的跨國公司,在許多國家都設有它的下屬分支機構或部門。為了讓分布在世界各地的 nn 個部門之間協同工作,公司搭建了乙個連線整個公司的通訊網路。
該網路的結構由 nn 個路由器和 n-1n−1 條高速光纜組成。每個部門都有乙個專屬的路由器,部門區域網內的所有機器都聯向這個路由器,然後再通過這個通訊子網與其他部門進行通訊聯絡。該網路結構保證網路中的任意兩個路由器之間都存在一條直接或間接路徑以進行通訊。
高速光纜的資料傳輸速度非常快,以至於利用光纜傳輸的延遲時間可以忽略。但是由於路由器老化,在這些路由器上進行資料交換會帶來很大的延遲。而兩個路由器之間的通訊延遲時間則與這兩個路由器通訊路徑上所有路由器中最大的交換延遲時間有關。
作為 m 公司網路部門的一名實習員工,現在要求你編寫乙個簡單的程式來監視公司的網路狀況。該程式能夠隨時更新網路狀況的變化資訊(路由器資料交換延遲時間的變化),並且根據詢問給出兩個路由器通訊路徑上延遲第 kk 大的路由器的延遲時間。
【任務】
你的程式從輸入檔案中讀入 nn 個路由器和 n-1n−1 條光纜的連線資訊,每個路由器初始的資料交換延遲時間 t_iti
,以及 qq 條詢問(或狀態改變)的資訊。並依次處理這 qq 條詢問資訊,它們可能是:
1、由於更新了裝置,或者裝置出現新的故障,使得某個路由器的資料交換延遲時間發生了變化。
2、查詢某兩個路由器 aa 和 vv 之間的路徑上延遲第 kk 大的路由器的延遲時間。
輸入格式
第一行為兩個整數 nn 和 qq,分別表示路由器總數和詢問的總數。
第二行有 nn 個整數,第 ii 個數表示編號為i的路由器初始的資料延遲時間 t_iti
。緊接著 n-1n−1 行,每行包含兩個整數 xx 和 yy。表示有一條光纜連線路由器 xx 和路由器 yy。
緊接著是 qq 行,每行三個整數 k,a,bk,a,b。
如果 k=0k=0,則表示路由器 aa 的狀態發生了變化,它的資料交換延遲時間由 t_ata
變為 bb。
如果 k>0k>0,則表示詢問 aa 到 bb 的路徑上所經過的所有路由器(包括 aa 和 bb)中延遲第 kk 大的路由器的延遲時間。注意 aa 可以等於 bb,此時路徑上只有乙個路由器。
輸出格式
對於每乙個第二種詢問(即 k>0k>0 ),輸出一行。
包含乙個整數為相應的延遲時間。如果路徑上的路由器不足 kk 個,則輸出資訊 invalid request!。
輸入輸出樣例
輸入 #1複製
5 55 1 2 3 4
3 12 1
4 35 3
2 4 5
0 1 2
2 2 3
2 1 4
3 3 5
輸出 #1複製32
2invalid request!
說明/提示
【資料範圍】
對於 100%100% 的資料,1\le n,q \le 800001≤n,q≤80000,0 \le k \le n0≤k≤n,任意乙個路由器在任何時刻都滿足延遲時間小於 10^8108。
要求第k大,主席樹。
要查兩點間路徑,處理到根的字首和,求出lca後差分。
要帶修,發現每次改的是子樹。那麼可以考慮dfs序,就成了每次改區間。
改區間,再差分一下就成了單點修改查詢字首。直接上樹套樹即可。
#include
using
namespace std;
const
int n=
8e4+
50,m=
2e7+
50,k=
1e8;
int n,q,a[n]
,ver[n*2]
,nxt[n*2]
,head[n]
,tot,f[n][17
],d[n]
,dfn[n]
,rr[n]
,cnt,r[n]
;int lc[m]
,rc[m]
,sum[m]
;struct node
voidl(
)voidr(
)void
init
(int x)
}a,b,c,d;
intin()
void
add(
int x,
int y)
void
dfs(
int x,
int ff)
intlca
(int x,
int y)
void
change
(int
&x,int l,
int r,
int p,
int d)
void
change
(int x,
int p,
int d)
intquery
(int l,
int r,
int d)
a.l(
),b.l(
),c.l(
),d.l(
);return
query
(l,mid,d-dat);}
intmain()
a.init
(dfn[x]
);b.
init
(dfn[y]
);c.
init
(dfn[z]
);d.
init
(dfn[f[z][0
]]);
printf
("%d\n"
,query(1
,k,k));
}else
change
(dfn[x]
,a[x],-
1),change
(rr[x]+1
,a[x],1
),change
(dfn[x]
,a[x]
=y,1),
change
(rr[x]+1
,y,-1)
;}return0;
}
CTSC2008 網路管理 樹剖 整體二分
這題的複雜度可以到達驚人的 log 4 據說還能跑過去 差點沒嚇死我 直接二分 樹剖樹套樹 n log 4 n 乙個 log 也不少的4 log 但是我有個 log 3 的樹剖上面整體二分 線段樹的做法 不過據說有個 log 做法,我不會,反正我菜就是了 然後的話 就直接考慮個消除貢獻 然而並不需要...
BZOJ1146 CTSC2008 網路管理
樹狀陣列與線段樹 題目傳送門 在尤拉序上用樹狀陣列套權值線段樹搞事情。在進的時候加一,出去的時候減一。從尤拉序第一位到當前點的 l 就是根到當前點的狀態 因為其他的路徑一進一出抵消掉了 然後你求出兩個點的 lca 和 lca 的父親減一減跑一跑就好了。時間複雜度 o nlog 2n 空間複雜度 o ...
CODEVS1490 CTSC2008 網路管理
題目描述 description m公司是乙個非常龐大的跨國公司,在許多國家都設有它的下屬分支機構或部門。為了讓分布在世界各地的n個部門之間 協同工作,公司搭建了乙個連線整個公司的通訊網路。該網路的結構由n個路由器和n 1條高速光纜組成。每個部門都有乙個專屬的路由器,部門區域網內的所有 機器都聯向這...