poj3162(樹形dp 線段樹)

2022-07-19 14:24:37 字數 1167 閱讀 6336

題意:n個結點構成一棵樹 ,mc將在n天,依次按結點編號設為起點,選取距離起點最遠的結點作為終點,得到最遠距離。問:找到乙個區間,使得這個區間裡最大最小值的差距不超過m,求區間的最大長度。

解題思路:

求每天的最遠距離很明顯是樹形dp的問題,求的n個值後,我們可以用線段樹來儲存這些值。每次維護區間的l,r,用線段樹求的該區間的最大最小值,然後判斷該區間是否符合要求。可以把l,r初始值都設為1,然後往右移動即可。

#include#include#include#define inf 0x3f3f3f3f

using namespace std;

const int mod=1e9+7;

const int maxn=1e6+5;

typedef long long ll;

int cnt;

int head[maxn];

struct ststm[maxn*2];

void add(int u,int v,int w)

int dis[maxn];

int n,m;

int dp[maxn][3];

void dfs1(int now,int fa)

else if(dp[to][0]+w>dp[now][1]) }}

void dfs2(int now,int fa)

else

dfs2(to,now); }}

int tre[maxn*4][2];

void pushup(int rt)

void build(int l,int r,int rt)

int mid=(l+r)/2;

build(l,mid,rt*2);

build(mid+1,r,rt*2+1);

pushup(rt);

}int query0(int lm,int rm,int l,int r,int rt)

int mid=(l+r)/2;

int ans=0;

if(mid>=lm)

if(mid=r)

int mid=(l+r)/2;

int ans=inf;

if(mid>=lm)

if(mid=maxs)

else

} cout

}

POJ 3162(樹形DP 單調佇列)

題意 求1 n 在樹上的最遠距離d i 1 i n 然後求出d陣列裡最長區間長度且滿足區間最大值 最小值 m 思路 樹形dp求出陣列d 然後兩個單調佇列分別維護最小值最大值,並且維護乙個最左端點l,更新佇列 端點和答案即可。ac include include include include usi...

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

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

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

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