ARC121E Directed Tree
ARC121E Directed Tree
有意思的容斥加树 dp。
思路
\(a_i\) 可以是除去 \(i\) 祖先之外的所有点,考虑 \(a_i\) 的逆排列。
每一个 \(i\) 在正排列里都可以被不是自己子树内的点选择,那么逆排列里 \(i\) 不可以放自己子树内的点(不包括自己)。
现在转换求逆排列的方案数。
考虑容斥,设 \(g_i\) 为有 \(i\) 个位置不合法的方案数。
有 \(ans=\sum_{i=0}^n (-1)^ig_i(n-i)!\)。
\((n-i)!\) 有 \(n-i\) 个位置可以随便放 \(n-i\) 个数。
求 \(g_i\) 考虑树 dp,设 \(f_{u,i}\) 为 \(u\) 子树内有 \(i\) 个点不合法的方案数(只考虑不合法的点)。
因为 \(u\) 的不同子树,不合法的范围不相交,有:
\]
\(v,v'\) 是 \(u\) 的儿子。
但这时求出来的 \(f_u\) 是 \(u\) 没选择的结果,加上 \(u\) 位置的选择:
\]
有 \(sz_u-1\) 个点可选,\(i-1\) 个点被选了。
那么 \(g_i=f_{1,i}\)。
时间复杂度 \(O(n^2)\)。
CODE
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mod 998244353
const int maxn=2e3+5;
int n;
int siz[maxn];
ll ans;
ll fac[maxn],f[maxn][maxn],g[maxn];
vector<int>E[maxn];
void dfs(int u)
{
f[u][0]=1,siz[u]=1;
for(auto v:E[u]) dfs(v);
for(auto v:E[u])
{
for(int i=0;i<=siz[u]+siz[v];i++) g[i]=0;
for(int i=0;i<=siz[u];i++) for(int j=0;j<=siz[v];j++) g[i+j]=(g[i+j]+f[u][i]*f[v][j]%mod)%mod;
for(int i=0;i<=siz[u]+siz[v];i++) f[u][i]=g[i];
siz[u]+=siz[v];
}
for(int i=siz[u];i>=1;i--) f[u][i]=(f[u][i]+f[u][i-1]*(siz[u]-i)%mod)%mod;
}
int main()
{
scanf("%d",&n);
fac[0]=1;
for(int i=1;i<=n;i++) fac[i]=fac[i-1]*i%mod;
for(int i=2;i<=n;i++)
{
int x;
scanf("%d",&x);
E[x].push_back(i);
}
dfs(1);
for(int i=0;i<=n;i++) f[1][i]=f[1][i]*fac[n-i]%mod;
for(int i=0;i<=n;i++)
{
ll k=1;
if(i&1) k=-1;
ans=(ans+k*f[1][i])%mod;
}
printf("%lld",(ans+mod)%mod);
}
ARC121E Directed Tree的更多相关文章
- [atARC121E]Directed Tree
令$b_{a_{i}}=i$,那么问题即要求$i$不是$b_{i}$的祖先,也即$b_{i}$不严格在$i$的子树中 显然$a_{i}$和$b_{i}$一一对应,因此我们不妨统计$b_{i}$的个数 ...
- HDOJ 3516 Tree Construction
四边形优化DP Tree Construction Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Jav ...
- gym 100589A queries on the Tree 树状数组 + 分块
题目传送门 题目大意: 给定一颗根节点为1的树,有两种操作,第一种操作是将与根节点距离为L的节点权值全部加上val,第二个操作是查询以x为根节点的子树的权重. 思路: 思考后发现,以dfs序建立树状数 ...
- hdu3516 Tree Construction
Problem Description Consider a two-dimensional space with a set of points (xi, yi) that satisfy xi & ...
- CodeForces 1062E Company
Description The company \(X\) has \(n\) employees numbered from \(1\) through \(n\). Each employee \ ...
- CHANGE DETECTION IN ANGULAR 2
In this article I will talk in depth about the Angular 2 change detection system. HIGH-LEVEL OVERVIE ...
- Codechef Dynamic Trees and Queries
Home » Practice(Hard) » Dynamic Trees and Queries Problem Code: ANUDTQSubmit https://www.codechef.co ...
- Codeforces Round #603 (Div. 2) F. Economic Difficulties dp
F. Economic Difficulties An electrical grid in Berland palaces consists of 2 grids: main and reserve ...
- [hdu6990]Directed Minimum Spanning Tree
模板题:在有向图中,对每一个点求以其为根的最小(外向)生成树 (当图是强连通时)可以使用朱刘算法,算法过程如下: 1.对每一个节点,选择指向该点的边权最小的边,即得到一张子图 2.任选这张子图的一个简 ...
- Is It A Tree?[HDU1325][PKU1308]
Is It A Tree? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
随机推荐
- Linux下编程常用基本命令
Linux常用命令 基本操作命令 ls命令 ls -l # 列出文件和目录的详细信息 ls -R # 列出所有文件 ls -a # 列出隐藏文件 l;s # 列出 mv命令 mv example.tx ...
- Mac 打开软件提示‘“xxx”已损坏,无法打开。您应该将它移到废纸篓。’解决方法
产生错误的原因是软件没有签名.使用下面的命令给软件签名就好了. sudo xattr -rd com.apple.quarantine /Applications/xxx.app
- APT 使用
使用 Ubuntu 包搜索器 apt 命令 功能 apt install 安装软件包 apt remove 移除软件包 apt purge 移除软件包及配置文件 apt update 刷新存储库索引 ...
- 【前端js】之小数点保留时的四舍五入问题
项目遇到金额小数点保留位数,极个别的数会差一分,经调查是因为js的问题. 解决办法: # 方法一:保留两位小数 function keepTwoDecimal(num) { var result = ...
- 深入理解c语言指针与内存
一.将int强制转换为int指针,将int指针强转换为int void f(void) { int *p = (int*)100; //将int强制转换为int指针 printf("%d\n ...
- 线性dp:LeetCode122.买卖股票的最佳时机ll
买卖股票 本文所讲解的内容与LeetCode122. 买卖股票的最佳时机ll,这道题题意相同,阅读完本文后可以自行挑战一下 力扣链接 题目叙述: 给定一个长度为N的数组,数组中的第i个数字表示一个给定 ...
- 闲的蛋疼整理了一下Dockerfile的命令和参数备查
Dockerfile 主要指令及参数: 指令 主要参数 作用 用法示例 FROM <image>[:<tag>] [AS <name>] 指定基础镜像 FROM u ...
- 合合信息通过ISO/IEC国际标准双认证,为全球用户提供高合规标准AI服务
互联网.AI等技术的全球普及为人们提供便捷服务的同时,也带来了信息安全领域的诸多挑战.保护用户隐私及数据安全,是科技企业规范.健康发展的重心.近期,上海合合信息科技股份有限公司(简称"合合信 ...
- C# + WPF 音频播放器 界面优雅,体验良好
前言 本文介绍一款使用 C# 与 WPF 开发的音频播放器,其界面简洁大方,操作体验流畅.该播放器支持多种音频格式(如 MP4.WMA.OGG.FLAC 等),并具备标记.实时歌词显示等功能. 另外, ...
- QT原理与源码分析之QT对象类型QObject源码中的间接的设计思想
这一篇文章介绍QT框架中QT对象类型QObject类型的源代码在设计上的一个比较优秀的设计思想. QObject类型定义 QObject 直接来看QObject的源代码.为了表达更简洁更直观,这里省略 ...