題意:n個結點構成一棵樹 ,mc將在n天,依次按結點編號設為起點,選取距離起點最遠的結點作為終點,得到最遠距離。問:找到乙個區間,使得這個區間裡最大最小值的差距不超過m,求區間的最大長度。
解題思路:
求每天的最遠距離很明顯是樹形dp的問題,求的n個值後,我們可以用線段樹來儲存這些值。每次維護區間的l,r,用線段樹求的該區間的最大最小值,然後判斷該區間是否符合要求。可以把l,r初始值都設為1,然後往右移動即可。
#include#include#include#define inf 0x3f3f3f3fusing 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...