計算客444 (2015計蒜之道 京東的物流路徑)

2021-07-05 20:07:07 字數 2330 閱讀 2114

題目鏈結

作為乙個電子商務為主體的公司,京東一直努力實現自己「多、快、好、省」的承諾。其中,「快」的特質更是被京東發揮到了極致。京東建立了乙個非常高效的物流網路,物流網路構成了乙個樹結構,由很多的物流點和將物流點鏈結起來的道路組成。

京東物流網路中每個物流點有乙個權值 di,物流點間的道路也都有乙個權值 wi。對於一條物流網路中的路徑,令路徑上所有物流點權值 di 的最小值為 mind,路徑上所有道路權值 wi 的總和為 sumw,則該條路徑的總權值為 mind* sumw。路徑的起點和終點可以是物流網路中的任意物流點,且路徑中不能出現重複的物流點。

請求出京東的這個樹形物流網路所有路徑總權值中的最大值。

輸入格式

第一行輸入乙個整數 t(1 ≤ t ≤ 50),表示資料組數。

每組資料第一行乙個整數 n(1 ≤ n ≤ 105),表示有 n 個物流點。

之後一行 n 個整數,表示每個物流點的權重 di(1 ≤ di ≤ 109)。

接下來有 n - 1 行,每行 3 個整數 ui,vi,wi(1 ≤ ui, vi ≤ n, 1 ≤ wi ≤ 109),表示有一條連線 ui 和 vi 的權值為 wi的道路。輸入資料保證沒有重複出現的(ui,vi)點對,且最終一定會形成乙個樹形物流網路。

最多有 10 組資料的 n 超過 104。

輸出格式

一共輸出 t 行,每行乙個整數,表示路徑總權值的最大值。

樣例1輸入:

1

31 2 3

1 2 1

1 3 2

輸出:

3

提示資訊

總權值最大的路徑是 2 - 1 - 3,mind 為 min(1, 2, 3) = 1,sumw 為 sum(1, 2) = 3,因此總權值為 1 * 3 = 3。

思路:樹分治。求得重心,以重心為樹根遍歷所在子樹,求得所有點到根的路徑資訊(子樹編號、路徑長度、路徑最小點權)。

關鍵在於如何高效率的更新答案,思路為先按照路徑最小點權由小到大排序,從後往前遍歷,對於當前路徑,滿足要求的解為,樹編號不一樣的且不小於其最小點權的路徑長度最大的。所以要記錄並更新之前的最長路徑,和與最長路徑子樹編號不一樣的次長路徑,這樣最優答案即為其中與當前路徑編號不一樣的乙個。

當時比賽時不知道樹分治的思想,普通思路一直超時。題解說點分治,並不知道什麼意思,這幾天學習了樹分治想起這個題,便根據自己的理解敲了一遍。

#pragma comment(linker, "/stack:10240000000,10240000000")

#include#include#include#include #include#include#include#include#include#include#include#includeusing namespace std;

#define eps 1e-8

#define pii pair#define inf 0x3f3f3f3f

#define rd(x) scanf("%d",&x)

#define rd2(x,y) scanf("%d%d",&x,&y)

#define rd3(x,y,z) scanf("%d%d%d",&x,&y,&z)

#define mo(x) memset(x,0,sizeof(x))

#define ll long long int

#define mod 1000000007

#define maxn 101000

#define maxm 10000001

int mi(int a,int b)

struct node

edge[maxn*2];

int head[maxn],vis[maxn],tot;

int d[maxn],sz[maxn],mx[maxn];

//ll dis[maxn];

ll res;

int n,nn;

void init()

void addedge(int u,int v,int w)

void dfsize(int x,int fa)

}void dfsroot(int r,int x,int fa,int &root,int &mm)

}else if(dis[i].w>m2.w&&dis[i].k!=m1.k) m2=dis[i];

}}void solve(int x)

}int main()

{ int t,u,v,w;

rd(t);

while(t--){

rd(n);

init();

for(int i=1;i<=n;i++) rd(d[i]);

for(int i=1;i

計蒜客 2019計蒜之道D

題意 現在給定你乙個字串 s ss 以及乙個整數 k kk,請求出 s ss的字典序最小的長度為 k kk的子串行。資料範圍 0 s 5000000 00 s 5000 000 樣例輸入 helloworld 5樣例輸出 ellld思路 假如我們先不考慮長度為k的限制我們應當怎麼做?我們以樣例為例子...

計蒜客 計算質數

對於大於1的數,如果除了1和它本身,它不能再被其它正整數整除,那麼我們說它是乙個質數。曉萌想判斷乙個數是不是質數,希望找你寫個程式,幫助她進行判斷。輸入包括一行,為乙個整數n 1 n 1000 正是曉萌給出你讓你判斷的數字。輸出包括一行,如果曉萌給出的整數n為質數,那麼輸出yes 如果n不是質數,那...

2016計蒜之道初賽

官方題解 另外搜尋題解的時候看到乙個很有意思的部落格.大一進省賽的妹子otz 畫出以頂點 o 為公共頂點的 夾角為 的兩條線段l1和l2,其中l1作為圓 c1的直徑,l2作為圓 c2的直徑。兩個圓需要畫在同乙個圓形的塑料板上。請算出這個塑料板最小的面積是多少。字串處理 很坑的是oj 測試 只是測試能...