zoukankan      html  css  js  c++  java
  • 洛谷P4383 [八省联考2018]林克卡特树

    题目描述

    题解

    题目可以转化一下,就是要在原树中选出 $k+1$ 条不相交的链使得其权值和最大。

    考虑暴力 $ ext{dp}$ : $f[u][i][0/1/2]$ 表示 $u$ 子树选了 $i$ 条链, $u$ 没有连边/有一条出边/有两条出边的最大值,可惜是 $O(nk^2)$ 的过不去。

    稍微感性理解一下,如果设选出 $x$ 的答案为 $f(x)$ 的话,那应该是个上凸壳,所以可以采用 $ ext{wqs}$ 二分把第二维消掉,具体来说就是选每条链的时候就 $-mid$ ,然后记录一下取最大值的时候选了多少条链即可。效率 $O(nlogc)$ 。(感觉写了上一篇就很套路了)

    代码

    #include <bits/stdc++.h>
    #define LL long long
    using namespace std;
    const int N=3e5+5,M=N<<1;
    const LL F=-2e18;LL c;
    int n,k,hd[N],V[M],W[M],nx[M],t;
    struct O{LL x;int y;}A,f[N][3],g[3];
    bool operator < (O A,O B){
        return A.x!=B.x?A.x<B.x:A.y>B.y;
    }
    O operator + (O A,O B){
        return (O){A.x+B.x,A.y+B.y};
    }
    void add(int u,int v,int w){
        nx[++t]=hd[u];V[hd[u]=t]=v;W[t]=w;
    }
    void dfs(int u,int fr){
        f[u][0]=(O){0,0};f[u][1]=(O){-c,1};f[u][2]=(O){F,0};
        for (int v,i=hd[u];i;i=nx[i]){
            if ((v=V[i])==fr) continue;dfs(v,u);
            for (int j=0;j<3;j++) g[j]=f[u][j];
            O ax=max(f[v][0],max(f[v][1],f[v][2]));
            f[u][0]=max(f[u][0],g[0]+ax);
            f[u][1]=max(f[u][1],g[1]+ax);
            f[u][1]=max(f[u][1],g[0]+f[v][1]+(O){W[i],0});
            f[u][2]=max(f[u][2],g[2]+ax);
            f[u][2]=max(f[u][2],g[1]+f[v][1]+(O){c+W[i],-1});
        }
    }
    int main(){
        cin>>n>>k;k++;LL l,r=0;
        for (int i=1,u,v,w;i<n;i++)
            scanf("%d%d%d",&u,&v,&w),
            add(u,v,w),add(v,u,w),r+=abs(w);
        l=-r;while(l<r){
            c=(l+r)>>1,dfs(1,0);
            A=max(f[1][0],max(f[1][1],f[1][2]));
            if (A.y>k) l=c+1; else r=c;
        }
        c=l;dfs(1,0);
        cout<<max(f[1][0],max(f[1][1],f[1][2])).x+c*k<<endl;
        return 0;
    }
  • 相关阅读:
    django之session cookie
    自定义分页器
    Django与AJAX
    django之Models里常用小参数choices
    django之跨表查询及添加记录
    django之数据库表的单表查询
    ACM-ICPC 2018 徐州赛区网络预赛 B BE, GE or NE(博弈,记忆化搜索)
    ACM-ICPC 2018 徐州赛区网络预赛 A Hard to prepare
    hdu6365 2018 Multi-University Training Contest 6 1004 Shoot Game
    hdu6444 2018中国大学生程序设计竞赛
  • 原文地址:https://www.cnblogs.com/xjqxjq/p/12347371.html
Copyright © 2011-2022 走看看