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

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

访客 技术 2026年5月31日 51

模拟赛总结

编号 总分 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 安装(...

linux screen 用法详情 (nohup 的替代方案)

一、screen 是什么?能干嘛?screen 是一个终端复用器,可以:在一个 SSH 会话中开多个“虚拟终端”SSH 断线后,程序仍然在后台运行随时重新连接到原来的会话特别适合:nohup 的替代方案跑脚本 / 爬虫 / 训练模型运维、远程开发二、安装 screen# CentOS / Rocky / Almayum install -y screen# Debian / Ubuntuapt i...

PHPStan 有什么用?怎么用?

PHPStan 是一个 PHP 的静态分析工具,在不运行代码的情况下就能帮你发现潜在问题,比如:传错类型(把 string 传给接受 int 的函数)访问不存在的属性 / 方法null 没处理好永远不会执行到的代码数组 key/值类型不一致返回值不符合声明注释和真实类型不匹配它非常适合:想提升代码质量、减少线上 bug、统一团队风格的人(尤其是中大型项目)。一、PHPStan 有什么用(通俗点说)...

PHP 8.5 新特性

PHP 8.5 是在 2025 年 11 月 20 日发布的一个重要版本,带来不少实用的新语法、库增强和调试/性能改进。下面按类别整理主要新特性: 1. 新语法 & 表达力增强 管道操作符(Pipe Operator |>)允许把上一个表达式的值通过管道传给下一个可调用函数,从左往右串联处理,代码更可读:$result = $input    |> trim...

发表评论

访客

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