zoukankan      html  css  js  c++  java
  • BZOJ5290 & 洛谷4438:[HNOI/AHOI2018]道路——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=5290

    https://www.luogu.org/problemnew/show/P4438

    的确不是很难的题。

    ——————————————————

    先是吐槽时间(可略过):

    设f[i][j][k]为以i为根的子树中j公路不修k铁路不修的最小值。

    然后dfs就能过……不过貌似我想的dfs可能要存很多东西……觉得正解肯定没有那么麻烦,于是就弃疗了。

    ——————————————————

    设f[i][j][k]表示i子树叶子到1节点路程j公路不修k铁路不修的最小值。

    那么设l=s[u],r=t[u],则f[u][i][j]=min(f[l][i+1][j]+f[r][i][j],f[l][i][j]+f[r][i][j+1]);

    当然f数组很大,不过发现一些状态用完了就没有了,所以可以垃圾回收一下。

    #include<cmath>
    #include<stack>
    #include<queue>
    #include<cstdio>
    #include<cctype>
    #include<cstdlib>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    typedef long long ll;
    const ll INF=1e18;
    const int N=4e4+5;
    inline int read(){
        int X=0,w=0;char ch=0;
        while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
        while(isdigit(ch))X=(X<<3)+(X<<1)+(ch^48),ch=getchar();
        return w?-X:X;
    }
    int n,tot,s[N],t[N],dfn[N];
    ll a[N],b[N],c[N],f[110][41][41];
    stack<int>bin;
    void dfs(int u,int x,int y){
        if(u<n){
        dfs(s[u],x+1,y);dfs(t[u],x,y+1);
        }
        if(bin.empty())dfn[u]=++tot;
        else{dfn[u]=bin.top();bin.pop();}
        if(u<n){
        bin.push(dfn[s[u]]);bin.push(dfn[t[u]]);
        }else{
        for(int i=0;i<=40;i++)
            for(int j=0;j<=40;j++)
            f[dfn[u]][i][j]=c[u]*(a[u]+i)*(b[u]+j);
        return;
        }
        int l=dfn[s[u]],r=dfn[t[u]],k=dfn[u];
        for(int i=0;i<=x;i++)
        for(int j=0;j<=y;j++)
            f[k][i][j]=min(f[l][i+1][j]+f[r][i][j],f[l][i][j]+f[r][i][j+1]);
    }
    int main(){
        n=read();
        for(int i=1;i<n;i++){
        s[i]=read(),t[i]=read();
        if(s[i]<0)s[i]=-s[i]+n;
        if(t[i]<0)t[i]=-t[i]+n;
        }
        for(int i=1;i<=n;i++)a[i+n]=read(),b[i+n]=read(),c[i+n]=read();
        dfs(1,0,0);
        printf("%lld
    ",f[dfn[1]][0][0]);
        return 0;
    }

    +++++++++++++++++++++++++++++++++++++++++++

     +本文作者:luyouqi233。               +

     +欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+

    +++++++++++++++++++++++++++++++++++++++++++

  • 相关阅读:
    AttributeUsage属性
    LINQ基本子句
    js 变动首页参与人数
    C#控件的闪烁问题解决方法总结
    AttributeUsage
    MVC3 js+flash图片滚动
    通过写后台权限领悟到的东西
    删除同辈元素并添加指定元素的类
    JS产生两个数之间的随机数
    Web Service 学习笔记
  • 原文地址:https://www.cnblogs.com/luyouqi233/p/9125158.html
Copyright © 2011-2022 走看看