首页 > 其他分享 >牛客2022多校DAY10-K You are given a tree

牛客2022多校DAY10-K You are given a tree

时间:2023-12-23 19:46:42浏览次数:32  
标签:given 颜色 int tree 多校 DAY10

「牛客2022多校DAY10-K」 You are given a tree...

简要题意

给一棵带点权和边权的树,找到至多 \(k\) 个点权不同的点,使得它们之间路径覆盖的边权和最大。

\(n\le 5000,k\le 5\)。

Solution

考虑颜色数量不大的时候怎么暴力。显然可以直接状压 DP,压一下当前选择的颜色集合为 \(S\),在子树 \(i\) 内的最大覆盖边权为 \(f(i,S)\),转移的时候 \(\mathcal O(3^n)\) 枚举子集,可以做到 \(\mathcal O(n3^n)\) 的复杂度。

注意到 \(k\) 并不大,所以选择的颜色也只有很少,如果能让颜色数量也变得跟 \(k\) 一样少就行了,因此想到随机化。考虑将每个颜色随机映射到 \([1,k]\) 的一个数上,然后使用上面的做法。这种做法显然会出错,因此计算一下出错的概率:

原来的 \(k\) 个颜色在随机之后互不相同的概率为 \(\dfrac {k!}{k^k}\),当 \(k=5\) 时大约是 \(0.038\),那么错误率为 \(0.962\),因此重复计算 \(200\) 次仍然出错的概率为 \(0.962^{200}\approx 0.0004\),正确率大概是 \(0.9996\),除非脸太黑,否则都可以过。

Code
#include<bits/stdc++.h>
#define int long long

using namespace std;

namespace Hanx16qwq {
constexpr int _N = 5e3 + 5;
int n, k, a[_N], b[_N], col[_N];
struct EDGE{int nxt, to, l;} edge[_N << 1];
int tot, head[_N];
void AddEdge(int x, int y, int l) {
    edge[++tot] = {head[x], y, l};
    head[x] = tot;
}
int f[_N][64], temp[64], maxn, ans = INT_MIN;
void DfsForAns(int x, int fa) {
    f[x][0] = f[x][1 << col[x]] = 0;
    for (int i = head[x]; i; i = edge[i].nxt) {
        int twd = edge[i].to;
        if (twd == fa) continue;
        DfsForAns(twd, x);
        memcpy(temp, f[x], sizeof f[x]);
        for (int s = 1; s < maxn; s++)
            for (int ss = s; ss; ss = (ss - 1) & s)
                if (ss != (maxn - 1))
                    f[x][s] = max(f[x][s], temp[s ^ ss] + f[twd][ss] + edge[i].l);
    }
    ans = max(ans, f[x][maxn - 1]);
}
mt19937 rnd(114514);
void main() {
    cin >> n >> k; maxn = 1 << k;
    for (int i = 1; i <= n; i++) cin >> a[i];
    for (int i = 1, u, v, l; i < n; i++) {
        cin >> u >> v >> l;
        AddEdge(u, v, l);
        AddEdge(v, u, l);
    }
    int Times = 200;
    while (Times--) {
        for (int i = 1; i <= n; i++) b[i] = rnd() % k;
        for (int i = 1; i <= n; i++) col[i] = b[a[i]];
        memset(f, 0xcf, sizeof f);
        DfsForAns(1, 0);
    }
    cout << ans << '\n';
}

}
signed main() {
    cin.tie(0)->sync_with_stdio(0);
    Hanx16qwq::main();
    return 0;
}

标签:given,颜色,int,tree,多校,DAY10
From: https://www.cnblogs.com/hanx16msgr/p/17923510.html

相关文章

  • [ATdp v] Subtree
    [ATdpv]Subtree思路不难想到令\(f_u\)表示\(u\)子树内满足条件的答案数。有\[f_{u}=\prod_{v\inson_{u}}(f_v+1)\]然后换根求出\(g\)表示整棵树里的答案:\[g_u=(\dfrac{g_{fa}}{f_u+1}+1)f_u\]但是你会发现取模之后不一定有逆元,很尴尬。所以如果把\(f_......
  • QTreeWidget使用小案例
    一、概述使用QTreeWidget制作一个树形菜单。示例图: 二、代码示例#include"TreeWidgetExampleWindow.h"TreeWidgetExampleWindow::TreeWidgetExampleWindow(QWidget*parent):QWidget(parent){this->setWindowTitle("TreeWidget组件");QVBoxLayout*......
  • Js 之treeTable树状表格
    一、下载/**树形表格3.xCreatedbywangfanon2020-05-12https://gitee.com/whvse/treetable-lay*/layui.define(['laytpl','form','util'],function(exports){var$=layui.jquery;varlaytpl=layui.laytpl;varform......
  • 【c# winform】devexpress treeList右键菜单添加按钮
    本文提供俩种不需要手动添加编辑控件方法。方法一:创建新的右键菜单添加“执行选择”按钮,且抑制TreeList自带菜单结果展示: 代码: privatevoidForm1_Load(objectsender,EventArgse){CreateBarButtonItem();}privatevoidCreateBarButtonItem(){//创建右键......
  • [Ynoi2007]rfplca/[CF1491H] Yuezheng Ling and Dynamic Tree
    题目描述给定一棵大小为\(n\)的\(1\)为根节点的树,树用如下方式给出:输入\(a_2,a_3,\dots,a_n\),保证\(1\leqa_i<i\),将\(a_i\)与\(i\)连边形成一棵树。接下来有\(m\)次操作,操作有两种:1lrx令\(a_i=\max(a_i-x,1)(l\leqi\leqr)\)。2uv查询在当前的\(a\)......
  • Binary Tree Level Order Traversal II
    SourceGivenabinarytree,returnthebottom-uplevelordertraversalofitsnodes'values.(ie,fromlefttoright,levelbylevelfromleaftoroot).ExampleGivenbinarytree{3,9,20,#,#,15,7},3/\920/\157return......
  • a-tree-select的使用案例
    <a-tree-select:maxTagCount="6"@deselect="deSelectQueryDetailTreeData"@select="initQueryDetailTreeData"style="width:270px"v-mod......
  • CF1593E-Gardener-and-Tree-题解
    title:CF1593EGardenerandTree题解date:2022-05-2721:30:48categories:-题解原题面题意:给出一个\(n\)个点的树,删除\(k\)次叶子节点,求剩下的节点数。思路:设\(cnt_i\)为\(k\)最小为多少时点\(i\)会被删除。当\(i\)将要被删除时,它一定是现在的叶子,联......
  • vscode中Todo Tree插件的使用
    vscode中TodoTree插件的使用配置JSON将下方的JSON代码放入用户配置中复制JSON配置后,点击这里,然后粘贴。"todo-tree.tree.showScanModeButton":false,"todo-tree.filtering.excludeGlobs":["**/node_modules","*.xml","*.XML"],"todo......
  • 无涯教程-Java - TreeMap 类函数
    TreeMap类通过使用树来实现Map接口。TreeMap提供了一种有效的方式来按排序顺序存储键/值对,并允许快速检索。以下是TreeMap类支持的构造函数的列表。Sr.No.Constructors&Remark1TreeMap()此构造函数构造一个空的树Map,将使用其键的自然顺序对其进行排序。2TreeMap(......