牛客小白月賽13 F題

2021-09-19 03:48:42 字數 1712 閱讀 3752

小a這次來到乙個景區去旅遊,景區裡面有n個景點,景點之間有n-1條路徑。小a從當前的乙個景點移動到下乙個景點需要消耗一點的體力值。但是景區裡面有兩個景點比較特殊,它們之間是可以直接坐觀光纜車通過,不需要消耗體力值。而小a不想走太多的路,所以他希望你能夠告訴它,從當前的位置出發到他想要去的那個地方,他最少要消耗的體力值是多少。

177449

?type=

101&order=

0&pos=

7&page=

1這張圖可以認為是邊權全為1的樹上增加了一條邊權為0的邊。

首先先不考慮多出來的一條邊,那麼dep[u]表示點u的深度,任意兩點u,v的最短的距離就是

dep[u]

+dep[v]−2dep[

lca(u,v)],

加上這條邊後另外一種可能最短的路徑就是經過這條邊權為0的邊,可以建圖之後跑一次最短路,每次查詢的答案都是

min(dis[u]

+dis[v]

,dep[u]

+dep[v]−2dep[

lca(u,v)])。

#include

using

namespace std;

const

int maxn =

2e6+5;

int head[maxn]

, tot;

struct edge edge[maxn]

;int father[maxn]

, depth[maxn]

, size[maxn]

, son[maxn]

, top[maxn]

;int l[maxn]

, r[maxn]

, index;

void

init()

void

add(

int u,

int v)

void

dfs1

(int u,

int fa)

dfs1

(to, u)

; size[u]

+= size[to];if

(size[to]

> maxson)}}

void

dfs2

(int u,

int topf)

for(

int i = head[u]

; i !=-1

; i = edge[i]

.next)

dfs2

(to, to);}

r[u]

= index;

}int

lca(

int x,

int y)

x = father[top[x]];

}if(depth[x]

> depth[y]

)return x;

}int

main()

dfs1(1

,1);

dfs2(1

,1);

int a, b, c;

scanf

("%d%d"

,&a,

&b);

int x, y;

scanf

("%d"

,&m)

;for

(int i =

1; i <= m; i++

)return0;

}

牛客練習賽13 F 皇后

在乙個n n的西洋棋棋盤上有m個皇后。乙個皇后可以攻擊其他八個方向的皇后 上 下 左 右 左上 右上 左下 右下 對於某個皇后,如果某乙個方向上有其他皇后,那麼這個方向對她就是不安全的。對於每個皇后,我們都能知道她在幾個方向上是不安全的。現在我們想要求出t0,t1,t8,其中ti表示恰有i個方向是 ...

牛客小白月賽13 D題

位運算是乙個非常重要的東西。而小a最近在學習位運算,小a看到了一道很簡單的例題,是說從n個數裡面選出n 1個數要讓它們或起來的值最大,小a想知道這個答案是多少。你可以幫幫他嗎?思路 預處理了一下字首l陣列和字尾r陣列,然後列舉那個不選的數就可以了,每次更新ans max ans,l i 1 r i ...

牛客網 小白月賽13 B題

示例1 輸入dcbaabc輸出7說明 將前面的dcba移動到末尾變成abcdcba,這個字串的最大回文子串就是它本身,長度為7備註 n表示字串的長度,1 n 5000n表示字串的長度,1 n 5000本題呢,難就難在manacher 馬拉車 演算法,我也不是特別清楚,馬拉車演算法 就是在補題的時候稍...