香港記者跑的比誰都快是眾所周知的常識。
現在,香港記者站在一顆有 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。如果乙...