Codeforces 1067E - Random Forest Rank(找性质+树形 dp)
一道不知道能不能算上自己 AC 的 D1E(?)
挺有意思的结论题,结论倒是自己猜出来了,可根本不会证(
开始搬运题解 ing:
碰到这样的题我们肯定要考虑一个图邻接矩阵的秩是什么。显然根据我们幼儿园就学过的线性代数,对于一个矩阵 \(A\) 而言,其行列式就是其最大的子式满足其行列式不等于 \(0\),也就是任取若干行 & 若干列,它们的交组成的矩阵行列式不等于 \(0\),不难发现对于一个森林的邻接矩阵而言,对于任意一个子式,如果它的行列式不等于 \(0\),那么它的行、列下标的并组成的主子式的行列式肯定也非零,因此我们只用考虑其主子式就行了,而主子式显然可以看作导出子图的邻接矩阵,因此我们接下来只需探究什么样的矩阵行列式非零。
考虑行列式的展开式:
\]
显然对于后面的 \(\prod\) 而言,只有 \((i,p_i)\) 存在边相连时 \(A_{i,p_i}\) 才非零,而由于图无自环,如果 \(\exists i,s.t.i=p_i\) 必然有 \(p\) 对 \(\det A\) 的贡献为 \(0\),同理,如果 \(p\) 存在一个大小 \(\ge 3\) 的置换环,那么由于图是一个森林,不可能这些点之间两两相邻的点都存在边,对 \(\det A\) 的贡献也为 \(0\)。也就是说只有 \(p\) 中所有置换环大小都为二,也就是我们选出的是一个形如的 \((i,p_i)\) 的完美匹配,而由于图是一个森林,因此完美匹配个数肯定 \(\le 1\),具体构造方案就是从叶子开始贪心地匹配,如果匹配不了就不存在完美匹配,因此 \(\det A\) 非零的充要条件是图存在完美匹配,因此我们可以得到这样一个性质:
Observation. 对于图 \(G\) 而言,\(G\) 邻接矩阵的秩是 \(G\) 最大匹配的大小 \(\times 2\)。
有了这个性质之后就可以 DP 了。\(way_{i,0/1}\) 表示钦定以 \(i\) 为根的子树内的边,并且在最大匹配中 \(i\) 选/没选的方案数,\(dp_{i,0/i}\) 表示钦定以 \(i\) 为根的子树内的边,并且在最大匹配中 \(i\) 选/没选的所有方案中最大匹配个数的总和。转移就分 \((i,j)\) 的边选/不选,然后分类讨论一下即可,复杂度 \(\mathcal O(n)\)
const int MAXN=5e5;
const int MOD=998244353;
int n,hd[MAXN+5],to[MAXN*2+5],nxt[MAXN*2+5],ec=0;
void adde(int u,int v){to[++ec]=v;nxt[ec]=hd[u];hd[u]=ec;}
int dp[MAXN+5][2],way[MAXN+5][2];
void dfs(int x,int f){
way[x][0]=1;
for(int e=hd[x];e;e=nxt[e]){
int y=to[e];if(y==f) continue;dfs(y,x);
static int tmp_dp[2]={0},tmp_way[2]={0};
memset(tmp_dp,0,sizeof(tmp_dp));
memset(tmp_way,0,sizeof(tmp_way));
tmp_way[0]=(1ll*way[x][0]*(way[y][0]+way[y][1]))%MOD;
tmp_dp[0]=(1ll*dp[x][0]*(way[y][0]+way[y][1])+1ll*(dp[y][0]+dp[y][1])*way[x][0])%MOD;
tmp_way[1]=(1ll*way[x][1]*(way[y][0]+way[y][1])*2)%MOD;
tmp_dp[1]=2ll*(1ll*dp[x][1]*(way[y][0]+way[y][1])+1ll*(dp[y][0]+dp[y][1])*way[x][1])%MOD;
tmp_way[0]=(tmp_way[0]+1ll*way[x][0]*way[y][1])%MOD;
tmp_dp[0]=(tmp_dp[0]+1ll*dp[x][0]*way[y][1]+1ll*dp[y][1]*way[x][0])%MOD;
tmp_way[1]=(tmp_way[1]+1ll*way[x][0]*way[y][0])%MOD;
tmp_dp[1]=(tmp_dp[1]+1ll*dp[x][0]*way[y][0]+1ll*dp[y][0]*way[x][0]+1ll*way[x][0]*way[y][0])%MOD;
for(int i=0;i<2;i++) dp[x][i]=tmp_dp[i],way[x][i]=tmp_way[i];
}
// printf("%d %d %d %d %d\n",x,dp[x][0],dp[x][1],way[x][0],way[x][1]);
}
int main(){
scanf("%d",&n);
for(int i=1,u,v;i<n;i++) scanf("%d%d",&u,&v),adde(u,v),adde(v,u);
dfs(1,0);printf("%d\n",2ll*(dp[1][0]+dp[1][1])%MOD);
return 0;
}
Codeforces 1067E - Random Forest Rank(找性质+树形 dp)的更多相关文章
- CodeForces 1067E Random Forest Rank
题意 给定一棵 \(n\) 个节点的树,每条边有 \(\frac{1}{2}\) 的概率出现,这样会得出一个森林,求这个森林的邻接矩阵 \(A\) 的秩 \(\operatorname{rank} A ...
- Codeforces 348E 树的中心点的性质 / 树形DP / 点分治
题意及思路:http://ydc.blog.uoj.ac/blog/12 在求出树的直径的中心后,以它为根,对于除根以外的所有子树,求出子树中的最大深度,以及多个点的最大深度的lca,因为每个点的最长 ...
- CF1067E Random Forest Rank
CF1067E Random Forest Rank 可以证明: 一个树的邻接矩阵的秩,等于最大匹配数*2(虽然我只能证明下界是最大匹配) 而树的最大匹配可以贪心, 不妨用DP模拟这个过程 f[x][ ...
- Codeforces 1097G Vladislav and a Great Legend [树形DP,斯特林数]
洛谷 Codeforces 这题真是妙的很. 通过看题解,终于知道了\(\sum_n f(n)^k\)这种东西怎么算. update:经过思考,我对这题有了更深的理解,现将更新内容放在原题解下方. ...
- Codeforces 980F Cactus to Tree 仙人掌 Tarjan 树形dp 单调队列
原文链接https://www.cnblogs.com/zhouzhendong/p/CF980F.html 题目传送门 - CF980F 题意 给定一个 $n$ 个节点 $m$ 条长为 $1$ 的边 ...
- codeforces 816 E. Karen and Supermarket(树形dp)
题目链接:http://codeforces.com/contest/816/problem/E 题意:有n件商品,每件有价格ci,优惠券di,对于i>=2,使用di的条件为:xi的优惠券需要被 ...
- codeforces 161 D. Distance in Tree(树形dp)
题目链接:http://codeforces.com/problemset/problem/161/D 题意:给出一个树,问树上点到点的距离为k的一共有几个. 一道简单的树形dp,算是一个基础题. 设 ...
- [CQOI2009]叶子的染色【性质+树形Dp】
Online Judge:Bzoj1304,Luogu P3155 Label:无根树,树形Dp 题目描述 给定一棵\(N\)个节点的无根树,它一共有\(K\)个叶子节点.你可以选择一个度数大于1的节 ...
- Codeforces 1606F - Tree Queries(虚树+树形 dp)
Codeforces 题面传送门 & 洛谷题面传送门 显然我们选择删除的点连同 \(u\) 会形成一个连通块,否则我们如果选择不删除不与 \(u\) 在同一连通块中的点,答案一定更优. 注意到 ...
随机推荐
- leetcode779 第k个语法符号。
直接找规律. 第一行 0 第二行 01 第三行 0110 第四行 01101001 可以发现,第n行的数量比第n-1行多了一倍,并且前半部分是和第n-1行一样的,后半部分是前半部分"按位取反 ...
- 2020年09月15日-项目开发-python二次处理代码文件
Caterpillar通过将BPMN生成为solidity代码后, 我需要对solidity代码做二次处理,即在其中的特定函数中插入event类型,以便去做事件监听. 最终生成的不仅包括solidit ...
- shell关键字含义
linux中shell变量$#,$@,$0,$1,$2的含义解释: 变量说明: $$ Shell本身的PID(ProcessID) $! Shell最后运行的后台Process的PID $? 最后运行 ...
- Beta Scrum Meeting汇总
第0次Alpha Scrum Meeting 第1次Alpha Scrum Meeting 第2次Alpha Scrum Meeting 第3次Alpha Scrum Meeting 第4次Alpha ...
- HMS Core Keyring携手航班管家和高铁管家,打造美好出行体验
高铁管家是国内最早⽀持⼿机⽀付购买⽕⻋票App之⼀,日活用户超380万,为⽤户提供一站式铁路出⾏服务.高铁管家母公司--深圳市活⼒天汇科技股份有限公司是国内智能⼤出⾏的开创者,先后推出航班管家.⾼铁管 ...
- 大神教零基础入门如何快速高效的学习c语言开发
零基础如果更快更好的入门C语言,如何在枯燥的学习中找到属于自己的兴趣,如果把学习当成一种事务性的那以后的学习将会很难有更深入的进步,如果带着乐趣来完成学习那将越学越有意思这样才会让你有想要更深入学习的 ...
- Swift-Framework(一)访问资源文件
摘要 Framework 就是在 APP 应用中的一种封装功能的表现形式,虽然不能独立运行,但是也可以在它里面存放和访问图片.语音等资源文件,可算是麻雀虽小,五脏俱全. 毕竟不是 APP 工程,所以 ...
- 输入指令npx webpack-dev-server报错:Error: Cannot find module ‘webpack-cli/bin/config-yargs‘的解决方法
输入指令npx webpack-dev-server报错:Error: Cannot find module 'webpack-cli/bin/config-yargs'的解决方法 输入指令:npx ...
- 权限控制-RBAC(Role-Based Access Control)
RBAC是基于角色的权限访问控制,在RBAC中角色与权限相连,用户通过成为某个角色而得到角色的权限,这就极大的简化了权限的管理,用户和角色多对多,角色和权限多对多,由此产生用户表.角色表.权限表,用户 ...
- 查看Git提交的代码统计
1,提交Top5: git log --pretty='%aN' | sort | uniq -c | sort -k1 -n -r | head -n 5 2,某用户提交的代码统计 git log ...