bzoj 4871: [Shoi2017]摧毁“树状图”树形dp

Posted lokiii

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bzoj 4871: [Shoi2017]摧毁“树状图”树形dp相关的知识,希望对你有一定的参考价值。

做不来……参考https://www.cnblogs.com/ezyzy/p/6784872.html
技术分享图片

#include<iostream>
#include<cstdio>
using namespace std;
const int N=100005;
int T,o,n,h[N],cnt,f[N],g[N],q[N],q1[N],l[N],l1[N];
struct qwe
{
    int ne,to;
}e[N<<1];
int read()
{
    int r=0,f=1;
    char p=getchar();
    while(p>‘9‘||p<‘0‘)
    {
        if(p==‘-‘)
            f=-1;
        p=getchar();
    }
    while(p>=‘0‘&&p<=‘9‘)
    {
        r=r*10+p-48;
        p=getchar();
    }
    return r*f;
}
void add(int u,int v)
{
    cnt++;
    e[cnt].ne=h[u];
    e[cnt].to=v;
    h[u]=cnt;
}
inline int mx2(int a,int b)
{
    return a>b?a:b;
}
inline int mx3(int a,int b,int c)
{
    return mx2(a,mx2(b,c));
}
inline int mx4(int a,int b,int c,int d)
{
    return mx2(mx2(a,b),mx2(c,d));
}
inline int mx6(int a,int b,int c,int d,int e,int f)
{
    return mx2(mx2(a,b),mx2(mx2(c,d),mx2(e,f)));
}
void dfs(int u,int fa)
{
    int tot=0,mx=0;
    for(int i=h[u];i;i=e[i].ne)
        if(e[i].to!=fa)
        {
            dfs(e[i].to,u);
            int tf,tg,tq,tq1,tl,tl1;
            tf=mx4(f[u],f[e[i].to],q[e[i].to]+1,q1[e[i].to]+1);
            tg=mx6(g[u],g[e[i].to],f[u]+q[e[i].to],f[u]+q1[e[i].to],l[e[i].to]+1,l1[e[i].to]+1);
            tq=mx2(q[u]+1,q[e[i].to]+tot);
            tq1=mx2(q1[u]+1,q[u]+q[e[i].to]);
            tl=mx6(l[u]+1,l[e[i].to]+tot,q[u]+f[e[i].to],q1[u]+q[e[i].to],q1[e[i].to]+q[u],q[e[i].to]+mx);
            tl1=mx6(l1[u]+1,q1[e[i].to]+q1[u],l[u]+q[e[i].to],l[e[i].to]+q[u],q1[u]+f[e[i].to],q[e[i].to]+l[u]);
            mx=mx4(mx+1,tot+q1[e[i].to],tot+q[e[i].to],tot+f[e[i].to]);
            tot++;
            f[u]=tf,g[u]=tg,q[u]=tq,q1[u]=tq1,l[u]=tl,l1[u]=tl1;
        }
    q[u]=mx2(q[u],tot);
}
int main()
{
    T=read(),o=read();
    while(T--)
    {
        n=read();
        if(o==1)
            read(),read();
        else if(o==2)
            read(),read(),read(),read();
        for(int i=1;i<n;i++)
        {
            int x=read(),y=read();
            add(x,y),add(y,x);
        }
        dfs(1,0);
        printf("%d
",mx3(g[1],l1[1],l[1]));
        cnt=0;
        for(int i=1;i<=n;i++)
            h[i]=0;
        for(int i=1;i<=n;i++)
            f[i]=g[i]=q[i]=q1[i]=l[i]=l1[i]=0;
    }
    return 0;
}

以上是关于bzoj 4871: [Shoi2017]摧毁“树状图”树形dp的主要内容,如果未能解决你的问题,请参考以下文章

bzoj4869[Shoi2017]相逢是问候 线段树+扩展欧拉定理

BZOJ 2521: [Shoi2010]最小生成树

bzoj2521 [Shoi2010]最小生成树

BZOJ2521[Shoi2010]最小生成树 最小割

[BZOJ 3553][SHOI2014]三叉神经树

BZOJ4597[Shoi2016]随机序列 线段树