当前位置:首页 > 技术 > 正文内容

竞赛模拟与树形DP算法分析

访客 技术 2026年5月31日 1

模拟赛总结

编号 总分 A题 B题 C题 D题
8 83 62 0 13 8
用时 03:00:00 06:33:43 11:22:23 99:99:99 99:99:99

A. BOSS树:拓扑排序与子树贪心

本题使用拓扑排序思想,结合子树大小进行贪心决策。核心在于利用优先队列每次选取子树最大的节点处理。

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int MAXN = 1e5 + 5;
int n, m, inDegree[MAXN], subSize[MAXN];
vector<int> adj[MAXN];
struct Element {
    int idx;
};
vector<int> layers[MAXN];
int layerCount = 0;
vector<Element> temp;

bool operator < (const Element &a, const Element &b) {
    return subSize[a.idx] < subSize[b.idx];
}

priority_queue<Element> pq;

void calcSubsize(int u, int parent) {
    subSize[u] = 1;
    for (int v : adj[u]) {
        calcSubsize(v, u);
        subSize[u] += subSize[v];
    }
}

signed main() {
    freopen("boss.in", "r", stdin);
    freopen("boss.out", "w", stdout);
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    
    cin >> n >> m;
    for (int i = 2; i <= n; i++) {
        int f;
        cin >> f;
        adj[f].push_back(i);
        inDegree[i]++;
    }
    calcSubsize(1, 0);
    pq.push({1});
    
    while (!pq.empty()) {
        ++layerCount;
        for (int cnt = 1; cnt <= m && !pq.empty(); cnt++) {
            Element cur = pq.top();
            pq.pop();
            int u = cur.idx;
            layers[layerCount].push_back(u);
            for (int v : adj[u]) {
                inDegree[v]--;
                if (inDegree[v] == 0) temp.push_back({v});
            }
        }
        while (!temp.empty()) {
            pq.push(temp.back());
            temp.pop_back();
        }
    }
    
    cout << layerCount << '\n';
    for (int i = 1; i <= layerCount; i++) {
        cout << layers[i].size() << ' ';
        for (int x : layers[i]) cout << x << ' ';
        cout << '\n';
    }
    return 0;
}

B. 黄金树召唤:树上概率DP

本题使用两轮DFS进行树形动态规划。第一轮计算每个节点的概率值,第二轮使用递推修正每个节点的最终答案。

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int MAXN = 5e5 + 5;
int n, value[MAXN];
double prob[MAXN];
vector<int> edges[MAXN];
double dp[MAXN], result[MAXN], selfVal[MAXN], childSum[MAXN];

void dfs1(int u) {
    dp[u] = prob[u];
    for (int v : edges[u]) {
        dfs1(v);
        dp[u] *= (1 - dp[v]);
    }
}

void dfs2(int u) {
    result[u] = selfVal[u];
    for (int v : edges[u]) {
        selfVal[v] = childSum[u];
        double parentProduct = dp[u] / (1 - dp[v]);
        childSum[v] = (selfVal[u] + value[u]) * parentProduct 
                     + childSum[u] * (1 - parentProduct);
        dfs2(v);
    }
}

signed main() {
    freopen("tree.in", "r", stdin);
    freopen("tree.out", "w", stdout);
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    
    cin >> n;
    for (int i = 2; i <= n; i++) {
        int p;
        cin >> p;
        edges[p].push_back(i);
    }
    for (int i = 1; i <= n; i++) cin >> prob[i];
    for (int i = 1; i <= n; i++) cin >> value[i];
    
    dfs1(1);
    dfs2(1);
    
    double total = 0;
    for (int i = 1; i <= n; i++) total += max(0.0, result[i] * dp[i]);
    printf("%.6lf\n", total);
    
    return 0;
}

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。