POJ - 3162Walking Race(树形dp+单调队列)

题意:给一棵n个结点边带权的树,记结点i到其他结点最远距离为d[i]。

问d数组构成的这个序列中满足其中最大值与最小值的差不超过m的连续子序列最长是多长。

用树形dp来求树中的每个顶点到其他所有顶点距离的最大值。然后用单调队列求满足max-min<=m的连续子序列最长是多长。

//#include 
#include
#include
#include
#include
#include
#include

using namespace std;
typedef long long ll;
const int maxn=1e6+100;
struct node{
    int x;
    ll w;
    node(int _x,ll _w)
    {
        x=_x;
        w=_w;
    }
};
vectora[maxn];
int n;
ll m,dp[maxn],dpf[maxn];
void dfs(int u,int fa)
{
    for(int i=0;i=head1&&c[q[tail1]]>=c[i])
                tail1--;
            q[++tail1]=i;

            while(tail2>=head2&&c[p[tail2]]<=c[i])
                tail2--;
            p[++tail2]=i;
            if(c[p[head2]]-c[q[head1]]>m)
            {
                ans=max(i-pre,ans);
                if(q[head1]

 

 

 

你可能感兴趣的:(dp,单调队列,树形dp)