51NOD 1789 跑的比誰都快

2021-07-25 14:25:40 字數 1396 閱讀 9759

香港記者跑的比誰都快是眾所周知的常識。

現在,香港記者站在一顆有 n 個點的樹的根結點上(即1號點),編號為 i 的點擁有權值 a[i] ,資料保證每個點的編號都小於它任意孩子結點的別號。

我們假定這棵樹的每個葉子結點都在發生乙個大新聞,香港記者要用最少的耗時去報道其中的任意乙個。

若香港記者目前處於第 i 號點上,那麼它可以移動至以 i 為根的子樹上的任意一點 j ,耗時 a[i]+(j−i)p ,p為給定常數。

請問這位香港記者搞哪個大新聞的耗時最短?所耗時間是多少?

首先對一堆人用水法水過表示**和不爽!!!

顯然,這道題的n2

n

2做法真的是婦孺皆知,

先打乙個dp,每個點從它的乙個父親轉移過來,

那麼,對於一條鏈,很顯然就可以用斜率優化,

我們又發現,每次對原有的斜率優化佇列,可能是扔掉隊頭的一段,扔掉對尾的一段再在對尾加上乙個,

於是就可以用鍊錶,每次扔隊頭和對尾的時候記錄一下,做完當前的子樹以後再還原沒有扔數之前的佇列,

複雜度:o(

nlog(n

))o (n

log⁡(n

))

(斜率優化要用乙個二分(如果有線性的我也很茲瓷啊))

#include 

#include

#include

#define fo(i,a,b) for(ll i=a;i<=b;i++)

#define efo(i,q) for(int i=a[q];i;i=b[i][0])

#define h(i) (f[i]+b[i]+zhi[q-(i)])

using namespace std;

typedef long long ll;

const int n=200500;

int read(int &n)

int n,p,ed;

int b[2*n][2],a[n],b0,fa[n];

ll f[n],b[n];

ll ans,zhi[n];

int f[n][3],s,t,f0;

void link(int q,int w)

int hw(int q,int w)

return l;

}void dfs(int q)

int main()

zhi[i]=(ll)zhi[i]*i;

}if(ed!=n)break;

}ans=1e18;

f[s=t=++f0][1]=1;

efo(i,1)dfs(b[i][1]);

printf("%lld\n",ans);

return 0;

}

51Nod 1789 跑的比誰都快

香港記者跑的比誰都快是眾所周知的常識。現在,香港記者站在一顆有 n 個點的樹的根結點上 即1號點 編號為 i 的點擁有權值 a i 資料保證每個點的編號都小於它任意孩子結點的別號。我們假定這棵樹的每個葉子結點都在發生乙個大新聞,香港記者要用最少的耗時去報道其中的任意乙個。若香港記者目前處於第 i 號...

51nod1789 跑得比誰都快

設 f i 為根節點到 i 的最小耗時 設 s 為 i 的祖先集合,可以得到 f i min f j i j p j in s 對於 i j p 我們有 i 1 j 1 p i j p leq i 1 j p i j 1 p 可以發現這是乙個滿足四邊形不等式的式子 直接上決策單調性即可 我這個寫法是...

51nod 1240 莫比烏斯函式

莫比烏斯函式,由德國數學家和天文學家莫比烏斯提出。梅滕斯 mertens 首先使用 n miu n 作為莫比烏斯函式的記號。據說,高斯 gauss 比莫比烏斯早三十年就曾考慮過這個函式 具體定義如下 如果乙個數包含平方因子,那麼miu n 0。例如 miu 4 miu 12 miu 18 0。如果乙...