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\) 在同一连通块中的点,答案一定更优. 注意到 ...
随机推荐
- JavaScript03
类型转换和运算符 typeof函数 检测数据类型,可以使用以下两种调用的方式: typeof 变量或表达式 typeof(变量或表达式) var n="asda"; console ...
- Microsoft Porject Online 学习随手记一:环境创建和数据导入
没有想像的简单,也没那么复杂 Project OL之前是Dynamics 365 Enterprise P1中的一个模块,目前最新版本只能简单创建并且已经没有Enterprise P1选项. 主要流程 ...
- [no code][scrum meeting] Beta 10
$( "#cnblogs_post_body" ).catalog() 例会时间:5月25日15:00,主持者:伦泽标 下次例会时间:5月26日11:30,主持者: 一.工作汇报 ...
- 【二食堂】Alpha - 测试报告
TextMarking Alpha阶段测试报告 前后端测试过程及结果 在Alpha阶段,测试工作紧跟后端开发进度,一下是我们所做的一些测试工作. 后端单元测试 测试代码可以在git仓库中查看,后端对所 ...
- Java并发:Condition接口
Condition 接口与 Lock 配合实现了等待 / 通知模式,这个和 Object 的监视器方法(wait.notify.notifyAll 等方法)一样,都是实现了等待 / 通知模式,但这两者 ...
- 021中国大学生程序设计竞赛(CCPC)- 压力测试赛题解
A.Matrix 挺狗的一道题,从开始冲到最后都没冲出来,都没啥思路. 其实分开考虑每个数的贡献,这个想法也存在过,就是不知道该怎么计算,我们考虑我们单独考虑一个数字\(i(1\leq i\leq n ...
- (一)Mongodb学习之 Centos 7 单机部署
学习参考:https://www.runoob.com/mongodb/mongodb-tutorial.html 一.部署环境 1.系统:Centos 7 2.mongodb: mongodb-li ...
- 干货分享之spring框架源码分析02-(对象创建or生命周期)
记录并分享一下本人学习spring源码的过程,有什么问题或者补充会持续更新.欢迎大家指正! 环境: spring5.X + idea 之前分析了Spring读取xml文件的所有信息封装成beanDef ...
- Tomcat 内存马(一)Listener型
一.Tomcat介绍 Tomcat的主要功能 tomcat作为一个 Web 服务器,实现了两个非常核心的功能: Http 服务器功能:进行 Socket 通信(基于 TCP/IP),解析 HTTP 报 ...
- k8s入坑之路(16)kubernetes中CICD/基于宿主机jenkins
cicd的结合组件 需要代码仓库如gitlab.github.包构建工具Maven等,持续集成工具如jenkins,github/cicd.结合自己脚本实现重复式任务自动化. 传统服务发布流程: 提交 ...