實戰演練 test16 T3

2021-08-08 18:56:53 字數 2238 閱讀 3249

【題目背景】

小 x 是遠近聞名的學佛,平日裡最喜歡做的事就是蒸發學水。

小 x 所在的城市 x 城是乙個含有 n 個節點的無向圖,同時,由於 x 國是乙個發展中國家,為了節約城市建設的經費,x 國首相在建造 x 城時只建造 n – 1條邊,使得城市的各個地點能夠相互到達。

小 x 計畫蒸發 q 天的學水,每一天會有一名學水從 a 地走到 b 地,並在沿途各個地點留下乙個水塘。此後,小 x 會從 c 地走到 b 地,並用佛光蒸發沿途的水塘。由於 x 城是乙個學佛橫行的城市,學水留下的水塘即使沒有被小 x 蒸發,也會在第二天之前被其他學佛蒸發殆盡。

現在,小 x 想要知道,他每一天能夠蒸發多少水塘呢?

第一行三個整數 n、q、num,分別表示 x 城地點的個數,小 x 蒸發學水的天數,以及測試點編號。注意,測試點編號是為了讓選手們更方便的獲得部分分,你可能不需要用到這則資訊,在下發的樣例中,測試點編號的含義是該樣例滿足某一測試點限制。

接下來 n – 1 行,每行兩個整數 x、y,表示 x 地與 y 地之間有一條邊。

接下來 q 行,每行三個整數 a、b、c,表示一天中,有一名學水從 a 地走到b 地,而小 x 會從 c 地走到 b 地。

輸出 q 行,每行乙個整數,表示小 x 能夠蒸發的水塘數。

3 3 1

1 22 3

1 2 3

1 1 3

3 1 3

1

13

自己的想法:

性質1  樹退化成一條鏈 還是很好騙分的呀

性質2  dfs一遍 記錄步數即水塘數

題解:

【測試點 1-10】  對於每次詢問,將兩條路徑上的點全部加上 1,然後統計 2 的數量,作為答案輸出,詢問與詢問之間注意清空陣列。  該演算法的時間複雜度是 o(n * q)的。 

【*測試點 1-16】  對於某些資料結構學傻的同學,我提供了這一檔部分分。事實上,我們可以用樹鏈剖分的方法加速上述過程,注意清空陣列時應該當 作為修改改回去,而不能直接 memset,否則複雜度將退化。  該演算法的時間複雜度是 o(n + q * log2 n)的。 

【測試點 11-13、17-18】  這些測試點滿足特殊性質 1,樹退化成一條鏈。  那麼,我們只需要判斷兩個閉區間交的長度即可。  該演算法的時間複雜度是 o(n + q)的。 

【測試點 11、14-15、17、19】  這些測試點滿足特殊性質 2,a = c。  問題簡化成求 a 與 b 之間的距離,顯然可以用樹上倍增或 tarjan 演算法求出 a 與 b 的 lca,那麼 a 與 b 之間的距離就等於 a 的深度加 b 的深度減去 lca 的 深度的兩倍。  該演算法的時間複雜度是 o(n + q)或 o(( n + q)* log n)的。 

【測試點 1-20】  注意到問題實際上是問樹上乙個點到另外兩點路徑的重合長度,也就是說, 這兩條路徑有乙個端點是重合的,不妨就此性質構建演算法。樹上三點,或是呈一條鏈的形式,或是存在乙個中心,使得中心到三點之間 的路徑不相交。如下圖,上方的兩種情況是 a、b、c 點存在中心 o,下方兩種情況是 a、b、c 點在一條鏈上。

對於呈一條鏈的形式,我們不妨將三個點中,位於中間的那個點稱為三個點 的中心,如此一來,我們要求的答案實際上是中心到 b 點的距離。  那麼,如何求中心呢?通過觀察上圖,我們發現,中心一定是 a、b、c 點中 兩點的 lca。並且,通過進一步觀察,我們可以發現,中心是 a、b、c 點兩兩的 lca 中,深度最大的點。  所以,我們只需求出中心,在求出中心到 b 點的距離即可解決本題。  該演算法的時間複雜度是 o(n + q)或 o(( n + q)* log n)的。 

**實現:

#include#define maxn	200005

#define maxlog 20

using namespace std;

template void read(t &x)

int n,q,num;

vectora[maxn];

int fa[maxn][maxlog],depth[maxn];

void work(int pos,int f)

return fa[x][0];

}int dist(int x,int y)

int main(){

read(n),read(q),read(num);

for(int i=1;i

每日一題 test1

1.問題描述 第四平方和定理,又稱為拉格朗日定理 每個正整數都可以表示為至多4個正整數的平方和。如果把0包括進去,就正好可以表示為4個數的平方和。比如 5 0 2 0 2 1 2 2 2 1 2 1 2 1 2 2 2 符號表示乘方的意思 對於乙個給定的正整數,可能存在多種平方和的表示法。要求你對4...

題目 類Test1 類Test2定義如下

public class test1 public class test2 extends test1將以下哪種方法插入行6是不合法的。a float amethod float a,float b b public int amethod int a,int b throws exception ...

Nio實戰演練1(心跳服務)

在類似rpc 遠端過程呼叫 場景中為了保證傳輸的效率,通常情況下會採用長鏈結,而長鏈結的保持即通過定時心跳實現。類似場景在訊息推送服務中也是非常常見。所以心跳服務是網路程式設計中的基礎且普遍的應用。dubbo和zookpper都有心跳飽和機制 由客戶端定時傳送給服務端,服務端作出響應。因為一直要傳送...