#树形dp#C 树上排列

分析
设\(dp[x][i]\)表示以\(x\)为根的子树中\(x\)的排名为\(i\)的方案数,
然后枚举子节点转移即可,Talk is cheap,Show me the code
代码
#include <cstdio>
#include <cctype>
#define rr register
using namespace std;
const int N = 3011, mod = 998244353;
struct node {
int y, w, next;
} e[N << 1];
int siz[N], dp[N][N], f[N], as[N], fac[N], inv[N], n, et = 1, ans;
inline signed iut() {
rr int ans = 0;
rr char c = getchar();
while (!isdigit(c)) c = getchar();
while (isdigit(c)) ans = (ans << 3) + (ans << 1) + (c ^ 48), c = getchar();
return ans;
}
inline signed mo(int x, int y) { return x + y >= mod ? x + y - mod : x + y; }
inline signed C(int n, int m) { return 1ll * fac[n] * inv[m] % mod * inv[n - m] % mod; }
inline void dfs(int x, int fa) {
siz[x] = dp[x][1] = 1;
for (rr int i = as[x]; i; i = e[i].next)
if (e[i].y != fa) {
dfs(e[i].y, x);
for (rr int j = 1; j <= siz[x]; ++j) f[j] = dp[x][j], dp[x][j] = 0;
for (rr int j = 1; j <= siz[x]; ++j) {
rr int sum = 0;
if (e[i].w)
for (rr int o = siz[e[i].y]; ~o; --o)
dp[x][j + o] = mo(dp[x][j + o], 1ll * f[j] * C(j + o - 1, j - 1) % mod *
C(siz[x] + siz[e[i].y] - j - o, siz[x] - j) %
mod * sum % mod),
sum = mo(sum, dp[e[i].y][o]);
else
for (rr int o = 0; o <= siz[e[i].y]; ++o)
sum = mo(sum, dp[e[i].y][o]),
dp[x][j + o] = mo(dp[x][j + o], 1ll * f[j] * C(j + o - 1, j - 1) % mod *
C(siz[x] + siz[e[i].y] - j - o, siz[x] - j) %
mod * sum % mod);
}
siz[x] += siz[e[i].y];
}
}
signed main() {
freopen("perm.in", "r", stdin);
freopen("perm.out", "w", stdout);
n = iut(), fac[0] = fac[1] = inv[0] = inv[1] = 1;
for (rr int i = 2; i <= n; ++i) inv[i] = 1ll * (mod - mod / i) * inv[mod % i] % mod;
for (rr int i = 2; i <= n; ++i) fac[i] = 1ll * fac[i - 1] * i % mod;
for (rr int i = 2; i <= n; ++i) inv[i] = 1ll * inv[i - 1] * inv[i] % mod;
for (rr int i = 1; i < n; ++i) {
rr int x = iut(), y = iut();
e[++et] = (node){ y, 1, as[x] }, as[x] = et;
e[++et] = (node){ x, 0, as[y] }, as[y] = et;
}
dfs(1, 0);
for (rr int i = 1; i <= n; ++i) ans = mo(ans, dp[1][i]);
return !printf("%d", ans);
}
#树形dp#C 树上排列的更多相关文章
- 树形 dp 与树上问题
NFLS 集训笔记 20220802 - 树形 dp 进阶与树上问题综合 \(\text{By DaiRuiChen007}\) I. 洛谷[P2585] - 三色二叉树 \(\text{Link}\ ...
- 2019CCPC-江西省赛 -A Cotree (树形DP,求树上一点到其他点的距离之和)
我是傻逼我是傻逼 #include<bits/stdc++.h> using namespace std; const int maxn=4e5+50; typedef long long ...
- 树形dp复习 树上依赖背包问题
选课 今天又看了一下这道题,竟然AC不了了 自己的学习效率有点低下 要明白本质,搞透彻 #include<bits/stdc++.h> #define REP(i, a, b) for(r ...
- 【BZOJ2427】[HAOI2010] 软件安装(缩点+树形DP)
点此看题面 大致题意: 有\(N\)个软件,每个软件有至多一个依赖以及一个所占空间大小\(W_i\),只有当一个软件的直接依赖和所有的间接依赖都安装了,它才能正常工作并造成\(V_i\)的价值.求在容 ...
- 树形dp - 求树的直径
随着杭州西湖的知名度的进一步提升,园林规划专家湫湫希望设计出一条新的经典观光线路,根据老板马小腾的指示,新的风景线最好能建成环形,如果没有条件建成环形,那就建的越长越好. 现在已经勘探确定了n个位置可 ...
- 中南大学oj 1317 Find the max Link 边权可以为负的树上最长路 树形dp 不能两遍dfs
http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1317经典问题:树上最长路,边权可以为负值的,树形dp,不能用两边dfs.反例:5 41 2 22 ...
- 算法笔记--树的直径 && 树形dp && 虚树 && 树分治 && 树上差分 && 树链剖分
树的直径: 利用了树的直径的一个性质:距某个点最远的叶子节点一定是树的某一条直径的端点. 先从任意一顶点a出发,bfs找到离它最远的一个叶子顶点b,然后再从b出发bfs找到离b最远的顶点c,那么b和c ...
- 【BZOJ4033】[HAOI2015]树上染色 树形DP
[BZOJ4033][HAOI2015]树上染色 Description 有一棵点数为N的树,树边有边权.给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑色,并将其他的N-K个点染 ...
- BZOJ_4033_[HAOI2015]树上染色_树形DP
BZOJ_4033_[HAOI2015]树上染色_树形DP Description 有一棵点数为N的树,树边有边权.给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑色,并 将其他的 ...
- hihocoder 1676 树上等差数列 黑科技树形dp
#1676 : 树上的等差数列 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一棵包含N个节点的无根树,节点编号1~N.其中每个节点都具有一个权值,第i个节点的权值 ...
随机推荐
- Kotlin 协程五 —— 在Android 中使用 Kotlin 协程
目录 一.Android MVVM 结构 二.添加依赖 三.在后台线程中执行 3.1 协程解决了什么问题 3.2 保证主线程安全 3.3 withContext 的性能 四.结构化并发 4.1 追踪协 ...
- 【Azure 应用服务】 部署到App Service for Linux 服务的Docker 镜像,如何配置监听端口呢?
问题描述 根据以下DockerFile文件,创建了一个ASP.NET Core的 helloworld 镜像,通过监听3721端口来接受请求. # 1. 指定编译和发布应用的镜像 FROM mcr.m ...
- 【Azure 环境】在Azure活动目录中的应用注册,给应用添加API权限时发现API权限配置缺失
问题描述 在Azure活动目录中的应用注册,给应用添加API权限时,SecurityEvents.Read.All和IdentityRiskEvent两个权限,在Microsoft graph中找不到 ...
- 如何实现十亿级离线 CSV 导入 Nebula Graph
本文首发于 Nebula Graph Community 公众号 本次实践是基于业务需求及后续扩展,通过技术选型确定了 Nebula Graph 图数据库,首先需要验证 Nebula Graph 数据 ...
- 【主流技术】日常工作中关于 JSON 转换的经验大全(Java)
目录 前言 一.JSON 回顾 1.1结构形式 二.其它类型 -> JSON相关 2.1 JavaBean 转 JsonObject 2.2 JavaBean 转 Json 字符串 2.3 Li ...
- centos 目录磁盘使用情况
最简单的查看方法可以使用ls -ll.ls-lh命令进行查看,当使用ls -ll,会显示成字节大小,而ls- lh会以KB.MB等为单位进行显示,这样比较直观一些. 通过命令du -h –max- ...
- Prometheus技术分享——prometheus的函数与计算公式详解
Prometheus与zabbix相比,它的强大之处就在于可以它可以使用的很多计算公式去获取自己需要的数据.当然,这里所涉及到的计算公式,也是我们普遍认为的难点所在.比如,我们要获取CPU使用率,使用 ...
- 使用IDEA中的Git提交代码到错误的分支,回滚代码后如何强制push代码-2022新项目
一.问题由来 当前新项目的开发分支非常的多,自己看了一下大概有20多个分支.每次开发完一个版本就会重新创建几个新的分支,每个开发人员对应一个 自己单独的开发分支,因此才会出现这么多的分支.分支多了之后 ...
- period 发音 per + iod 没有ri音 (per=round od=hod=way)
period 发音 per + iod 没有ri音 pɪər iə d peri-在周围 + od-=hod-路,引申词义时期,阶段,句号等. per = round period 美: [ˈpɪrɪ ...
- Dashboard、Rancher与KubeSphere对比
在容器技术和微服务架构日益盛行的今天,对于容器编排和管理平台的选择显得尤为重要.Kubernetes(K8s)作为容器编排的事实标准,其生态系统中涌现出了许多管理和监控工具.其中,Dashboard. ...