51Nod 1789 跑的比誰都快

2021-08-02 17:43:29 字數 1636 閱讀 2098

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

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

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

若香港記者目前處於第 i 號點上,那麼它可以移動至以 i 為根的子樹上的任意一點 j ,耗時a[

i]+(

j−i)

p ,p為給定常數。

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

剛開始看錯題了調了半天賊尷尬……

首先可以推出一條n2

的dp,這個很容易,問題變成了如何把這條式子的時間複雜度降下來。可以發現式子存在單調性,設存在x、

y,且深

度x<

y ,他們到同乙個點的時,若co

st(x

)>co

st(y

) 之後

x 的花費也必然會大於

y的花費,此時

x 點就是個沒有貢獻的點,可以直接去掉。由此可以發現這個dp具有一定的單調性。這題的具體證明我就不在這裡給出,給個學習資料的鏈結(戳這裡1d1d動態規劃優化初步)。大概就是資料中所提到的決策模型,維護的相當於是根到葉子的路徑上有若干個切點,決策的是切點位置。

順帶提一句,51nod有幾個資料是多棵樹,但是直接只做以1為根的樹就可以了。

#include

#include

#include

#include

#include

using namespace std;

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

#define rep(i,x) for(i=la[x];i;i=ne[i])

#define calc(x,i) f[x]+c[i-x]+co[x]

typedef long long ll;

const int n=1e5+5;

struct stackz[n];

intne[n],da[n],la[n];

int i,j,sum,num,l,r,mx;

ll n,p,fa,c[n],ans,f[n],co[n];

char c;

intread(ll &x)

void ins(int

x,int

y)int divi(int l,int r)

return l;

}void dfs(int

x);z[r].sub=num;r=num;

rep(i,x) dfs(da[i]);

z[nowr].sub=last;l=l,r=r;

}int main()

if(c[i]>1e18) break;

}mx=(mx==n&&c[n]<=1e18)?n+1:mx;

ans=1e18;

fo(i,1,n) read(co[i]),read(fa),ins(fa,i);

l=r=num=1;z[1]=(stack);

rep(i,1) dfs(da[i]);

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

}

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。如果乙...