bzoj2500幸福的道路 樹形dp 單調佇列

2022-05-07 10:00:12 字數 1527 閱讀 1333

time limit: 20 sec  memory limit: 256 mb

submit: 434  solved: 170

[submit][status][discuss]

小t與小l終於決定走在一起,他們不想浪費在一起的每一分每一秒,所以他們決定每天早上一同晨練來享受在一起的時光.

他們畫出了晨練路線的草圖,眼尖的小t發現可以用樹來描繪這個草圖.

他們不願枯燥的每天從同乙個地方開始他們的鍛鍊,所以他們準備給起點標號後順序地從每個起點開始(第一天從起點一開始,第二天從起點二開始……). 而且他們給每條道路定上乙個幸福的值.很顯然他們每次出發都想走幸福值和最長的路線(即從起點到樹上的某一點路徑中最長的一條).

他們不願再經歷之前的大起大落,所以決定連續幾天的幸福值波動不能超過m(即一段連續的區間並且區間的最大值最小值之差不超過m).他們想知道要是這樣的話他們最多能連續鍛鍊多少天(hint:不一定從第一天一直開始連續鍛鍊)?

現在,他們把這個艱鉅的任務交給你了!

第一行包含兩個整數n, m(m<=10^9).

第二至第n行,每行兩個數字fi , di, 第i行表示第i個節點的父親是fi,且道路的幸福值是di.

最長的連續鍛鍊天數

3 21 1

1 33

資料範圍:

50%的資料n<=1000

80%的資料n<=100 000

100%的資料n<=1000 000

這其實是兩個題強行合在一起啊。。

首先是對於每個節點求它在樹上的最長路,可以樹形dp 2次,一次從兒子轉移一次從父親轉移

求最長連續區間的話維護兩個單調佇列max min就好

1 #include2 #include3 #include4 #include5

#define n 1000005

6#define ll long long

7using

namespace

std;

8int n,m,tot,w[n],hd[n],ans=1

;9 ll f[n],g[n],a[n];int

mx[n],mn[n];

10struct edgee[n<<1

];11

char

gc()

17int

read()

23void adde(int u,int v,int

w)29

void dfs1(int u,int

fa)36}37

void dfs2(int u,int

fa)45

for(int i=hd[u];i;i=e[i].next)51}

52void

solve()

63 ans=max(ans,i-t+1

);64}65

}66intmain()dfs1(1,0);dfs2(1,0

);72 solve();printf("%d"

,ans);

73return0;

74 }

bzoj 2500 幸福的道路

link 幸福的道路 題目有坑.題意 一棵樹 求出每個點到樹上另外乙個點的最大距離 在距離陣列上求出最長一段連續的區間使其極差 s 求區間長度最大值。題目說的標號的意思就是指樹上的標號 而不是重新的標號。求樹上某個點到另外乙個點的最大值 沒有什麼好的辦法 通常都是樹形dp 換根 換根比較基礎再維護乙...

bzoj2500 幸福的道路 樹形dp 單調佇列

小t與小l終於決定走在一起,他們不想浪費在一起的每一分每一秒,所以他們決定每天早上一同晨練來享受在一起的時光.他們畫出了晨練路線的草圖,眼尖的小t發現可以用樹來描繪這個草圖.他們不願枯燥的每天從同乙個地方開始他們的鍛鍊,所以他們準備給起點標號後順序地從每個起點開始 第一天從起點一開始,第二天從起點二...

bzoj 2500 幸福的道路 動態規劃 單調棧

題意 給出一棵樹,每條邊都有乙個長度。我們規定每個點的權值為從該點開始走過的一條最長的路徑的長度。求乙個最長的區間 l,r 使得 l,r 裡面點權的最大值和最小值只差不超過m。n 1000000 一開始看錯題目了,結果卡了半天。最後發現是一道大水題。先求點權,直接dp求,經典模型啊。隨便寫。後面求出...