ACWING 358 島嶼(基環樹直徑)

2021-10-10 21:56:51 字數 2585 閱讀 7121

題意:

你準備遊覽乙個公園,該公園由 n 個島嶼組成,當地管理部門從每個島嶼出發向另外乙個島嶼建了一座橋,不過橋是可以雙向行走的。

同時,每對島嶼之間都有一艘專用的往來兩島之間的渡船。

相對於乘船而言,你更喜歡步行。

你希望所經過的橋的總長度盡可能的長,但受到以下的限制:

可以自行挑選乙個島開始遊覽。

任何乙個島都不能遊覽一次以上。

無論任何時間你都可以由你現在所在的島s去另乙個你從未到過的島d。由s到d可以有以下方法:

(1)步行:僅當兩個島之間有一座橋時才有可能。對於這種情況,橋的長度會累加到你步行的總距離中。

(2)渡船:你可以選擇這種方法,僅當沒有任何橋和以前使用過的渡船的組合可以由s走到d(當檢查是否可到達時,你應該考慮所有的路徑,包括經過你曾遊覽過的那些島)。

注意,你不必遊覽所有的島,也可能無法走完所有的橋。

請你編寫乙個程式,給定n座橋以及它們的長度,按照上述的規則,計算你可以走過的橋的最大長度。

輸入格式

第1行包含整數 n 。

第 2… n+1 行,每行包含兩個整數 a 和 l,第 i+1 行表示島嶼 i 上建了一座通向島嶼 a 的橋,橋的長度為 l。

輸出格式

輸出乙個整數,表示結果。

對某些測試,答案可能無法放進32-bit整數。

資料範圍

2≤n≤106,

1≤l≤108

思路:

找基環樹的直徑。

本題是乙個基環森林,可以從一棵基環樹跳到其他基環樹上,所以基環樹之間不會影響,要求的就是每個基環樹的直徑。

解決基環樹問題,先將基環樹的環抽取出來。

基環樹直徑有兩種可能:

直徑是環上某個節點子樹的直徑

算出環上節點到子樹最大距離dep

[i

]dep[i]

dep[i]

,然後結果就是環上節點的組合。也就是max

(dep

[i]+

dep[

j]+m

ax(l

en,l

en−d

is(i

,j))

max(dep[i]+dep[j]+max(len,len-dis(i,j))

max(de

p[i]

+dep

[j]+

max(

len,

len−

dis(

i,j)

)。這個就是乙個環形dp問題了,可以用單調佇列解決。

#include

#include

#include

using

namespace std;

typedef

long

long ll;

const

int maxn =

2e6+7;

int to[maxn]

,head[maxn]

,nex[maxn]

,val[maxn]

,tot;

void

add(

int x,

int y,

int z)

struct node fa[maxn]

,loop[maxn]

;int dfn[maxn]

,id,cnt;

void

get_loop

(int x)

;for

(;y != x;y = fa[y]

.x)}

else}}

ll mx;

int vis[maxn]

,pos,now;

void

dfs(

int x,

int fa,ll w)

for(

int i = head[x]

;i;i = nex[i])}

ll sum[maxn]

,dep[maxn]

;int q[maxn]

;ll f

(int i)

intmain()

ll ans =0;

for(

int i =

1;i <= n;i++

)for

(int j =

1;j <= cnt;j++

)for

(int j =

1;j <= cnt;j++

)int l =

1,r =0;

for(

int j =

1;j <=

2* cnt;j++

)while

(l <= r &&

f(q[r]

)<=

f(j)

) q[

++r]

= j;

} ans +

= tmp;}}

printf

("%lld\n"

,ans)

;return0;

}

358 檔案上傳解析

檔案上傳解析 閱讀鴻洋大神部落格筆記 如果是瀏覽器上傳檔案,其實是把檔案資料轉換成2進製 然後按特定的格式傳送給伺服器 android也是乙個道理 先看看 然後再分析 public void uploadform mapparams,string fileformname,file uploadfi...

NYOJ 題目358 取石子 五)(博弈)

時間限制 1000 ms 記憶體限制 65535 kb 難度 4 描述 himdd最近很想玩遊戲,於是他找到acmj和他一起玩,遊戲是這樣的 有一堆石子,兩個人輪流從其中取走一定的石子,取走最後所有石子的人為贏家,不過得遵循如下規則 1.第一次取不能取完,至少取1顆.2.從第二次開始,每個人取的石子...

LM358使用注意事項

lm358是雙運放組成的運算放大器,可以單電源供電,也可以雙電源供電。常用來做電壓訊號採集的前端電壓跟隨器,同時起到增加輸入阻抗的作用,避免影響被測量的電壓值。lm358當工作在單電源5v供電時,當in 從0 5v輸入,其輸出電壓out只能從0 3.7v,而不是0 5v,也就是說,當in 輸入0 3...