[ARC101E] Ribbons on Tree 题解

news/2025/1/15 18:47:51/文章来源:https://www.cnblogs.com/Rock-N-Roll/p/18411164

[ARC101E] Ribbons on Tree 题解

其实算一道好题了。

首先考虑不相关的 simple 的 dp。平凡的想法是设 \(dp_{i,j}\) 表示 \(i\) 子树内有 \(j\) 个点还需要向上转移的方案数。转移式大概是个 \(dp_{x,i+j}=dp_{y,i+j-1}+(dp_{p,i-1}+dp_{q,j-1})\) 之类的东西。这样的 dp 是 \(O(n^3)\) 的,并且难以优化。于是考虑放弃这个想法。

由于 \(n\le5000\),图上问题我们考虑容斥来计算。考虑这个常见的容斥:设 \(s(i)\) 表示 钦定了 \(i\) 条边不选择,而不管其它边的方案数。容易得到 \(\text{ans}=\sum s(i)(-1)^i\)

考虑钦定边不选择的操作如何实现。考虑钦定一些边不选之后树会变成一些个连通块。这样一来我们尝试考虑依据连通块来 dp。那么对于每一个连通块里的点我们是可以任意连边的,并且容易得到对于 \(n\) 个点的树两两任意连边方案数是 \(\sum_{i=1}^{\frac{n}{2}}2\times i-1\) 的。现在考虑设出状态。

对于图上计数问题通常的策略是枚举 \(1\) 号点的连通块大小,那么我们尝试在本题中这么做。于是设 \(dp_{i,j}\) 表示 \(i\) 子树中 \(i\) 的连通块大小为 \(j\) 而不计这个连通块内部的方案数,即不考虑 \(s(j)\)

那么转移方程就是好得到的,我们枚举点 \(x\)\(i=siz_x\)\(y\)\(j=siz_y\),于是枚举 \((x,y)\) 选还是不选。如果选择做正的贡献,反之做负的贡献,通过这样的操作容斥计算方案数即可。

对于时间复杂度,事实上枚举 \(i,j\) 的操作的复杂度相当于对树上的每一个点对 \((x,y)\) 在 LCA 处枚举了一遍,因此时间复杂度 \(O(n^2)\)

整体上本题充分地考察选手综合运用容斥和 dp 知识解决问题的能力,环环相扣,解题逻辑清晰。是一道好题。

代码:

#include <bits/stdc++.h>
#define N 5005
#define int long long
#define mod 1000000007
using namespace std;
int n;
struct Node {int to, nxt;
} e[N << 1];
int head[N], cnt;
void add(int u, int v) {e[++cnt].to = v;e[cnt].nxt = head[u];head[u] = cnt;
}
int f[N][N], g[N];
int bas[N];
int siz[N];
void dfs(int x, int fa) {siz[x] = f[x][1] = 1;for (int i = head[x]; i; i = e[i].nxt) {int y = e[i].to;if (y == fa)continue;dfs(y, x);for (int j = 1; j <= siz[x]; j++)for (int k = 1; k <= siz[y]; k++) {if (j + k <= n)g[j + k] = (g[j + k] + f[x][j] * f[y][k] % mod) % mod;g[j] = (g[j] - f[x][j] * f[y][k] % mod * bas[k] % mod + mod) % mod;}siz[x] += siz[y];for (int j = 1; j <= siz[x]; j++)f[x][j] = g[j], g[j] = 0;}
}
int ans;
signed main() {cin >> n;for (int i = 1; i < n; i++) {int x, y;scanf("%lld%lld", &x, &y);add(x, y);add(y, x);}bas[0] = 1;for (int i = 2; i <= n; i += 2)bas[i] = bas[i - 2] * (i - 1) % mod;dfs(1, 0);for (int i = 2; i <= n; i += 2)ans = (ans + f[1][i] * bas[i] % mod) % mod;cout << ans << "\n";return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/796235.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java方法:什么是方法?

java方法是语句的集合,它们在一起执行一个功能:方法是解决一类问题的步骤的有序组合 方法包含于类或对象中 方法在程序中被创建,在其他地方被引用 例如:即 ______()是方法 设计方法的原则:方法的本意时功能块,就是实现某个功能块,就是实现某个功能的语句块的集合,所以…

pediatrics_llm_qa:儿科问诊小模型

项目简介 本项目开源了基于儿科医疗指令微调的问诊模型:pediatrics_llm_qa(GitHub - jiangnanboy/pediatrics_llm_qa),目前模型的主要功能如下:智能问诊:问诊后给出诊断结果和建议。更新[2024/09/11] 开源了基于Qwen2-1.5B-instruct lora指令微调的儿科问诊模型开源模型模型…

WPF 已知问题 包含 NaN 的 Geometry 几何可能导致渲染层抛出 UCEERR_RENDERTHREADFAILURE 异常

本文记录一个 WPF 已知问题,当传入到渲染的 Geometry 几何里面包含了 NaN 数值,将可能让应用程序收到从渲染层抛上来的 UCEERR_RENDERTHREADFAILURE 异常,且此异常缺乏必要信息,比较难定位到具体错误逻辑此问题是小伙伴报告给我的,详细请看 https://github.com/dotnet/wpf…

WPF 尝试使用 WinML 做一个简单的手写数字识别应用

最近我看了微软的 AI 训练营之后,似乎有点了解 Windows Machine Learning 和 DirectML 的概念,于是我尝试实践一下,用 WPF 写一个简单的触摸手写输入的画板,再使用大佬训练好的 mnist.onnx 模型,对接 WinML 实现一个简单的手写数字识别应用最近我看了微软的 AI 训练营之后…

VisualStudio 2022 找不到内存 反汇编 寄存器调试工具

本文将告诉大家如何解决在 VisualStudio 2022 的 调试-窗口 里面找不到内存、 反汇编、 寄存器这三个调试工具的问题找不到的原因是没有启用地址级调试 只需要在“工具”(或“调试”)>“选项”>“调试”中选择“启用地址级调试” 然后进行调试即可看到开启之后,即可在…

【TS】TypeScript基础详解【一】

Javascript 类型缺陷 类型引发的问题 在编程开发中,有一个共识:错误越早发现,就越容易解决。 例如:能在代码编写时发现错误,就不要等到代码编译时才发现(这也是IDE的优势之一)。 能在代码编译时发现错误,就不要在代码运行时才发现(类型检测可以帮助我们在这 方面做得很好…

【OpenFeign 】OpenFeign 的常用配置

1 前言 上节我们看了下 OpenFeign 里的重试,在从源码的角度看它的执行原理的时候,又意外的遇到了一个【OpenFeign 】OpenFeign 下未开启重试,服务却被调用了两次 的问题的分析,后面我们又看了重试器的入场和执行时机,那么本节我们看看 OpenFeign 的一些常用配置,以及全局…

Splay 浅谈

Splay 树 定义 Splay 树是一个二叉平衡搜索树,它可以通过 Splay 操作 将一个结点旋转至根结点或者一个给定的结点的下一层,使得整棵树仍然满足二叉搜索树的性质。 Splay 树可以在均摊 \(O(\log n)\) 的时间内完成查找、插入、查询、删除等操作。二叉搜索树的定义:空树是一个…

从kmp到AC自动机

知道kmp的请跳过这一段 找到最清晰的解析 kmp 我看了约114514个解析才搞懂 如何求next 首先,next[i]本应表示0~i的字符串的最长相同前缀后缀的长度。 不过为了方便匹配,实际可以存最长相同前缀后缀时前缀最后一个的地址 听起来好绕 那这么说吧: 例如串 abaabaabaab next[0]=…

LinkedHashMap原理详解—从LRU缓存机制说起

写在前面 从一道Leetcode题目说起 首先,来看一下Leetcode里面的一道经典题目:146.LRU缓存机制,题目描述如下:请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类:LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存 in…

微积分快速入门1部分:直觉

1 一分钟微积分:X射线和延时视觉 我们通常只看到图形、公式和情况的表面价值。微积分为我们提供了两种深入挖掘的超能力:X射线能看到图案中隐藏的部分。你不仅能看到树,还能知道它是由年轮组成的,在我们说话的同时,另一个年轮也在生长。延时视觉你能看到物体未来的运行轨迹…

torch.nn.Embedding的导入与导出

简介及导入转自:torch.nn.Embedding使用在RNN模型的训练过程中,需要用到词嵌入,使用torch.nn.Embedding可以快速的完成:只需要初始化torch.nn.Embedding(n,m)即可(n是单词总数,m是词向量的维度)(n是嵌入字典的大小,m是嵌入向量的维度。)。 注意: embedding开始是随机的…