首页 > 其他分享 >洛谷 P4383 [八省联考 2018] 林克卡特树

洛谷 P4383 [八省联考 2018] 林克卡特树

时间:2024-05-20 20:18:55浏览次数:13  
标签:八省 洛谷 fu val int max fvm 联考 DP

原题等价于在树上选出 \(k + 1\) 条不相交链,最大化边权和。

树形 DP。设 \(f_{u, k, 0/1/2}\) 表示在 \(u\) 的子树中选了 \(k\) 条链,\(u\) 的度数为 \(0, 1, 2\) 的最大边权和。

注意到状态里缺了链退化为单个点的情况,可以把它放到 \(f_{u, k, 2}\) 中(相当于自环)。

转移时分讨一下:

  • 若选 \((u, v)\)

\[f_{u,k_1,0} + f_{v,k_2,0} + w_{u, v} \to f_{u, k_1 + k_2 + 1, 1} \\ f_{u, k_1, 1} + f_{v, k_2, 0} + w_{u, v} \to f_{u, k_1 + k_2, 2} \\ f_{u, k_1, 1} + f_{v, k_2, 1} + w_{u, v} \to f_{u, k_1 + k_2 - 1, 2} \]

  • 若不选 \((u, v)\)

\[f_{u, k_1, t_1} + f_{v, k_2, t_2} \to f_{u, k_1 + k_2, t_1} \]

答案即 \(\max\limits_{t \in \{0, 1, 2\}}\{f_{1, k + 1, t}\}\)。时间复杂度 \(\mathcal O(nk)\)。

考虑优化。

注意到后一次的可选集合是前一次的子集,所以前一次的增量一定大于后一次的(形式化地,记 \(F_i\) 表示选出 \(i\) 条不相交链的最大边权和,则有 \(F_i - F_{i-1} > F_{i+1} - F_i\)),否则前后两次选的两条链可以交换顺序,使得前一次的答案更大。即 \((i, F_i)\) 连线形成的图像是一个上凸壳。

于是可以 wqs 二分,把状态里 \(k\) 那维删去,变为 \(f_{u, 0/1/2}\),表示在 \(u\) 的子树中选若干条链,\(u\) 不在链/在链中间/在链端点上的最大边权和,并记录每个状态下至少选了多少条链。

二分每条链的附加值 \(C(C \in N)\),因为前面在尽量少选,所以当选出链的个数 \(\le k + 1\) 时更新答案。时间复杂度 \(\mathcal O(n \log nv)\)。

代码

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

constexpr int N = 3e5 + 10;
constexpr ll inf = 4.5e18;

int n, k;

int tot, head[N];
struct Edge {int to, nxt, val;} e[N << 1];
inline void add(int u, int v, int w) {e[++tot] = Edge{v, head[u], w}, head[u] = tot;}

struct DP {
    ll f; int cnt;
    DP operator+(const DP &rhs) const {return {f + rhs.f, cnt + rhs.cnt};}
    bool operator<(const DP &rhs) const {return f != rhs.f ? f < rhs.f : cnt > rhs.cnt;}
} f[N][3], fu[3], fvm, res, O;

bool chk(ll C) {
    auto dfs = [&](auto &&self, int u, int fa) -> void {
        f[u][0] = {0, 0}, f[u][1] = {-inf, 0}, f[u][2] = {C, 1};
        for (int i = head[u], v; v = e[i].to, i; i = e[i].nxt) if (v != fa) {
            self(self, v, u);
            for (int t : {0, 1, 2}) fu[t] = f[u][t];
            fvm = max(max(f[v][0], f[v][1]), f[v][2]);
            f[u][0] = fu[0] + fvm;
            f[u][1] = max(fu[0] + max(f[v][0] + DP{e[i].val + C, 1}, f[v][1] + DP{e[i].val, 0}), fu[1] + fvm);
            f[u][2] = max(fu[1] + max(f[v][0] + DP{e[i].val, 0}, f[v][1] + DP{e[i].val - C, -1}), fu[2] + fvm);
        }
    };

    dfs(dfs, 1, -1);
    res = max(max(f[1][0], f[1][1]), f[1][2]);
    return res.cnt <= k + 1;
}

int main() {
    ios_base::sync_with_stdio(0); cin.tie(nullptr), cout.tie(nullptr);
    cin >> n >> k;
    for (int i = 1, u, v, w; i < n; i++) cin >> u >> v >> w, add(u, v, w), add(v, u, w);
    ll l = -1e12, r = 1e12, mid, ans;
    while (l <= r) {
        mid = (l + r) >> 1;
        if (chk(mid)) ans = res.f - mid * (k + 1), l = mid + 1;
        else r = mid - 1;
    }
    cout << ans;
    return 0;
}

标签:八省,洛谷,fu,val,int,max,fvm,联考,DP
From: https://www.cnblogs.com/chy12321/p/18202724

相关文章

  • 洛谷 P10512 序列合并
    哭死,比赛的时候完全想歪了,想的是考虑一次合并能造成多大的贡献,按照贡献排序然后合并。这样做只能考虑局部造成的贡献,然而最后算的时候要考虑整体,所以并不是很对。正着想没有思路就可以倒着想,考虑枚举答案。合并k次,意味着最后是n-k个数。经典从二进制高位到低位考虑,考虑这一位(假......
  • Solution -「洛谷 P8477」 「GLR-R3」春分 下界证明?!
      前情提要:在「洛谷P8477」「GLR-R3」春分中,我们给出了\(\frac{7}{6}n\pm\mathcalO(1)\)的解法,但没能给出相关的下界证明。现在我们尝试给出一个未完全完成的下界证明。  为方便描述,我们综合链接中题意和某个“通俗”的题意,称隔板为“板”,称溶液为“人”。  这个......
  • 「杂题乱刷」洛谷 P10467
    题目链接P10467[CCC2007]SnowflakeSnowSnowflakes解题思路字符串哈希板子题。思路就是我们给每个数列的所有排列都哈希一个值,然后判断是否有不同的数列的哈希值相同,如果有,就输出Twinsnowflakesfound.,否则就输出Notwosnowflakesarealike.。参考代码这里使用双哈......
  • 「杂题乱刷」洛谷 P10468 兔子与兔子
    题目链接P10468兔子与兔子解题思路字符串哈希板子题。思路就是我们给字符串的每一个前缀和后缀都用一种特定的方式使其变为一个值,比如取一个乘数和模数,可以证明这样出错的概率极低。参考代码这里使用自然溢出三哈希。#include<bits/stdc++.h>usingnamespacestd;#defin......
  • 洛谷题单指南-动态规划3-P1220 关路灯
    原题链接:https://www.luogu.com.cn/problem/P1220题意解读:按坐标顺序排列1~n个路灯,每个路灯有不同的功耗,老张从位置c开始关灯,第一时间关掉c位置的灯,每次关掉一个灯之后,可以往右走、也可以往左走关下一个灯,老张速度是1m/s,求所有灯都关掉所消耗的最少功耗。解题思路:由题意分析,关......
  • 洛谷题单指南-动态规划3-P4342 [IOI1998] Polygon
    原题链接:https://www.luogu.com.cn/problem/P4342题意解读:环中节点表示数字,边表示运算符,可以任意断一条边,其余节点两两按边的符号计算,求结果的最大值,以及最大值是断开那些边可以得到。解题思路:题意中有几个个关键信息:环形,节点数为n,边数为n任意断一条边,即可以从任意节点开始,......
  • 洛谷题单指南-动态规划3-P1070 [NOIP2009 普及组] 道路游戏
    原题链接:https://www.luogu.com.cn/problem/P1070题意解读:1~n个环形机器人工厂,相邻工厂之间的道路是1~n,每个时刻可以从任意工厂购买机器人,走不超过p时间,不同工厂购买机器人花费不同的金币,不同时刻走到不同道路也能得到不同的金币,问一共m时间,最多可以得到多少金币(需减去购买机器人......
  • 洛谷题单指南-动态规划3-P1063 [NOIP2006 提高组] 能量项链
    原题链接:https://www.luogu.com.cn/problem/P1063题意解读:本质上是一个环形石子合并问题,计算合并产生的最大能量。解题思路:对于环形DP问题,可以把环拆开,并复制2倍长度,然后用1~n的区间长度去枚举1、状态表示设structnode{inthead,tail}用于表示每一个项链节点,其中有头、尾......
  • 洛谷题单指南-动态规划3-P4170 [CQOI2007] 涂色
    原题链接:https://www.luogu.com.cn/problem/P4170题意解读:长度为n的字符串,每次可以将连续一段填为同一个字符,求要填成目标串的最少填涂次数。解题思路:1、状态表示:设s表示目标字符串,dp[i][j]表示将i~j涂成目标"颜色"的最少次数2、状态转移考虑i~j的两端,当i==j,说明只有一个......
  • 洛谷P3556 [POI2013] MOR-Tales of seafaring的三种解法
    本题模板为奇偶最短路(边权为1时的),题目链接:https://www.luogu.com.cn/problem/P3556为了研究,码了三种不同最短路解放的奇偶做法,便于不同群体理解.一:BFS,对于边权为1,求最短路当然是BFS最快了,时间复杂度:o(nm),代码如下:点击查看代码//背景:我的BFS奇偶最短路尝试//思......