10 21T3 樹上倍增

2022-05-01 18:30:09 字數 2295 閱讀 1215

小b正在樹上漫步,突然接到了小s的**,要他去點y買一些禮物,然而他現在正處於x點,然而他身上並沒有錢(其實錢無限多)。這個時候,小b遇到了小l,小l告訴了他乙個絕妙的方法,因為樹上的每個點都有dalao的存在,而這些dalao當中總有購買或**(**和購買**相同)bsoj許可權賬號的人,而且因為各點dalao數量不同,**也不同,這樣的交易能使他賺上一筆。小s沒有告訴他禮物的價錢,他只能賺盡量多的錢。由於小s在小b的身上裝了追蹤,所以他只能走x到y的最短路,而且時間不足,因此這樣的交易只能發生一次。

小b這樣的大神犇顯然已經知道求解方法了,但他為了不被小s發現,讓你來幫他解決這個問題。

輸入第一行是乙個整數 n,表示樹上的點數。

接下來n個正整數,表示每個點上許可權號的**。

接下來n-1行,每行兩個整數x,y,表示第x點和第y點有一條邊。

接下來乙個整數m,表示下來有m個詢問。

接下來有m行,每行兩個整數x和y,表示小b從第x點出發要到第y點。

輸出包括m行。

每行對應乙個詢問,乙個整數,表示小b最多能賺到多少錢。

103 4 1 2 7 6 1 5 3 9

1 21 9

3 19 7

5 96 9

8 74 7

10 7

35 6

8 10

2 4381

【規模與約定】 

對於前40%資料 n<=1000, m<=1000

對於100%資料 n<=250000 ,m<=10000,所有許可權號的**在int範圍之內。

題解:40分做法:

這個範圍顯然暴力能過啊

先將兩點跳到同一高度,再同時往上跳

以起點為例,跳的時候不斷維護最小值,並用當前點價減去最小值維護答案

終點往上跳就相反

到了最近公共祖先再拿maxn-minn維護最大答案

時間o(nm)

100分做法:

講講倍增的方法

兩邊的最大最小值的維護就不用講了吧

再記錄兩個值up[x][i] down[x][i]從x點往上或往下走2^i中交易能賺到的最多錢

這樣向上跳的時候,不僅要用up down更新答案

對於左邊,要時刻用現在的最大值-歷史的最小值更新答案

對於右邊,要時刻用歷史的最大值-現在的最小值更新答案

最後同理也要maxn-minn更新

時間o(m log2n)

code:

1 #include2 #include3

#define n 100005

4using

namespace

std;

5struct

node e[n];

8int

first[n],nxt[n],cnt;

9void add(int u,int

v) 15

int fa[n][30],mi[n][30],mx[n][30],zhengmx[n][30],fanmx[n][30

],dep[n],val[n];

16void dfs(int x,int

father) 28}

29int lca(int x,int

y) 36

for(int i=19; i>=0; i--)

40return fa[x][0

];41}42

intread()

49while

(isdigit(c))

53return x*f;54}

55int

main()

68 fa[1][0]=1

;69 zhengmx[1][0]=fanmx[1][0]=0

;70 mx[1][0]=mi[1][0]=val[1

];71 dfs(1,1

);72

//for(int i=1;i<=n;i++)cout<<" father->"<73

for(int i=1; i<=20; i++) 82}

83//

for(int i=1; i<=n; i++)cout<<"now->"<"<"<"<"<"<84

//cout<85

intq;

86 q=read();

87while(q--)

100if(dep[fa[v][i]]>=dep[all])

106}

107 cout<'\n'

;108

}109

return0;

110 }

over

NOIP2012 T3開車旅行 set 倍增

70分做法 先預處理出所有點的最近和次近 o n 2 一遍就ok 然後暴力求出每個解 o nm by siriusren include include include define inf 0x3fffffff using namespace std int n,x,rech 0x3fffffff...

CSP S2019 D1T3 樹上的數

給定乙個大小為 n nn 的樹,它共有 n nn 個結點與 n 1 n 1 n 1 條邊,結點從 1 n 1 sim n 1 n 編號。初始時每個結點上都有乙個 1 n 1 sim n 1 n 的數字,且每個 1 n 1 sim n 1 n 的數字都只在恰好乙個結點上出現。接下來你需要進行恰好 n ...

九校聯考DAT2T3 啟發式合併,倍增

南極的企鵝王國大學中生活著 n 只企鵝,作為 21 世紀的優秀大學生,企鵝們積極響應 大眾創業,萬眾創新 的號召,紛紛創業。但是創業需要資 金,企鵝們最近手頭比較緊,只能互相借錢。企鵝的借錢行為是有規律可循的 每只企鵝只會借一次錢,並且只會 從乙隻企鵝那裡借錢。借錢關係中不存在環 即不存在類似 金企...