POJ 3162(樹形DP 單調佇列)

2021-09-28 10:58:43 字數 3116 閱讀 2067

題意:求1~n 在樹上的最遠距離d[i] , 1<=i<=n; 然後求出d陣列裡最長區間長度且滿足區間最大值-最小值<=m;

思路:樹形dp求出陣列d; 然後兩個單調佇列分別維護最小值最大值,並且維護乙個最左端點l,更新佇列 、端點和答案即可。

ac**

#include

#include

#include

#include

using

namespace std;

typedef

long

long ll;

const

int n=

1e6+5;

const

int inf=

0x3f3f3f3f

;const

int mod=

1e9+7;

#define ls (i<<1)

#define rs (i<<1|1)

#define fi first

#define se second

#define mk make_pair

#define mem(a,b) memset(a,b,sizeof(a))

ll read()

while

(isdigit

(ch)

)return x*t;

}struct edge

edge

(int ff,

int tt,

int ww,

int nn)};

edge e[n<<1]

;ll f[n]

,g[n]

;int p[n]

,head[n]

,tot,n,m;

pairint> qmax[n]

,qmin[n]

;void

add(

int from,

int to,

int w)

void

dfs(

int u,

int pre)

}void

dfs2

(int u,

int pre)

g[u]

+=tmp;

for(

int i=head[u]

;i;i=e[i]

.next)

if(e[i]

.to!=pre)

dfs2

(e[i]

.to,u);}

void

init()

intmain()

dfs(1,

0);dfs2(1

,0);

int ans=

0,l=1;

int h1=

1,h2=

1,t1=

0,t2=0;

for(

int i=

1;i<=n;i++

) ans=

max(ans,i-l+1)

;}printf

("%d\n"

,ans);}

}

wa**(不知道**錯了,反正重寫就過了,改日再找)

#include

#include

#include

#include

using

namespace std;

typedef

long

long ll;

const

int n=

1e6+5;

const

int inf=

0x3f3f3f3f

;const

int mod=

1e9+7;

#define ls (i<<1)

#define rs (i<<1|1)

#define fi first

#define se second

#define mk make_pair

#define mem(a,b) memset(a,b,sizeof(a))

ll read()

while

(isdigit

(ch)

)return x*t;

}struct edge

edge

(int ff,

int tt,ll ww,

int nn)};

edge e[n<<1]

;int head[n]

,tot;

ll f[n]

,g[n]

,p[n]

;pair qmax[n]

,qmin[n]

;void

add(

int from,

int to,ll w)

void

dfs(

int u,

int pre)

// printf("f[%d]=%d\n",u,f[u]);

}void

dfs2

(int u,

int pre)

g[u]

+=tmp;

// printf("%d %lld\n",u,g[u]);

for(

int i=head[u]

;i;i=e[i]

.next)

}void

init

(int n)

intmain()

dfs(1,

0);dfs2(1

,0);

ll h1=

1,h2=

1,t1=

0,t2=0;

ll l=

1,ans=0;

for(

int i=

1;i<=n;i++

) ans=

max(ans,i+

1-l);}

printf

("%lld\n"

,ans);}

return0;

}/*4 31 4

1 22 2

*/

poj 3162 樹形dp 單調佇列 很好的題

include include include include include include include include include include include include include include define iinf 1000000000 define linf 100...

poj3162(樹形dp 線段樹)

題意 n個結點構成一棵樹 mc將在n天,依次按結點編號設為起點,選取距離起點最遠的結點作為終點,得到最遠距離。問 找到乙個區間,使得這個區間裡最大最小值的差距不超過m,求區間的最大長度。解題思路 求每天的最遠距離很明顯是樹形dp的問題,求的n個值後,我們可以用線段樹來儲存這些值。每次維護區間的l,r...

poj3162(樹形dp 線段樹求最大最小值)

題意 給一棵樹,求每個結點的樹上最遠距離,記為a i 然後求最大區間 l,r 滿足區間內的max a i min a i m。思路 第一步向hdoj2196那題一樣樹形dp求出每個結點的最長距離,我的另一篇部落格中有寫到求出最遠距離a i 後,建立線段樹維護區間的最大最小值。然後用兩個指標i,j遍歷...