The 15th Chinese Northeast Collegiate C. Vertex Deletion(树形dp)
LINK
对于节点 u u u来说(分别对应状态 0 , 1 , 2 0,1,2 0,1,2)
定义 f [ i ] [ 0 / 1 / 2 ] f[i][0/1/2] f[i][0/1/2]表示当 i i i分别满足以下三个条件时,子树内节点全部符合要求时的答案
Ⅰ.如果删去这个节点,那么 u u u一定满足条件
Ⅱ.如果不删去 u u u,且所有儿子被删掉.那么此时 u u u还没满足条件,需要父亲也不被删去
Ⅲ.如果不删去 u u u,且所有儿子中至少有一个没删掉.那么 u u u满足条件,父亲怎样无所谓
可以发现这个设计非常合理,比如
f [ u ] [ 0 ] = ∏ v ∈ s o n u f [ v ] [ 0 ] + f [ v ] [ 2 ] f[u][0]=\prod\limits_{v\in son_u}f[v][0]+f[v][2] f[u][0]=v∈sonu∏f[v][0]+f[v][2]
f [ u ] [ 1 ] = ∏ v ∈ s o n u f [ v ] [ 0 ] f[u][1]=\prod\limits_{v\in son_u}f[v][0] f[u][1]=v∈sonu∏f[v][0]
但是发现转移 f [ u ] [ 2 ] f[u][2] f[u][2]时有点变化,我们可以采用容斥的办法
也就是所有方案数-不合法的方案数,即为
f [ u ] [ 2 ] = ∏ v ∈ s o n u ( f [ v ] [ 0 ] + f [ v ] [ 1 ] + f [ v ] [ 2 ] ) − ∏ v ∈ s o n u f [ v ] [ 0 ] f[u][2]=\prod\limits_{v\in son_u}(f[v][0]+f[v][1]+f[v][2])-\prod\limits_{v\in son_u}f[v][0] f[u][2]=v∈sonu∏(f[v][0]+f[v][1]+f[v][2])−v∈sonu∏f[v][0]
显然 f [ r o o t ] [ 0 ] + f [ r o o t ] [ 2 ] f[root][0]+f[root][2] f[root][0]+f[root][2]即是答案
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int mod = 998244353;
const int maxn = 1e5+10;
int n,f[maxn][3];
vector<int>vec[maxn];
/*
f[i][0]表示自己被删掉
f[i][1]表示自己没删去,且没有儿子和自己相连
f[i][2]表示自己没删去,且至少有一个儿子和自己相连
*/
void dfs(int u,int fa)
{f[u][0] = f[u][1] = f[u][2] = 1;for(auto v:vec[u] ){if( v==fa ) continue;dfs( v,u );f[u][0] = ( f[v][0]+f[v][2] )%mod*f[u][0]%mod;f[u][1] = f[u][1]*f[v][0]%mod;f[u][2] = ( f[v][0]+f[v][1]+f[v][2] )%mod*f[u][2]%mod; }f[u][2] = ( f[u][2]-f[u][1] )%mod;//f[u][2]为总方案数-所有儿子都被删去的方案数
}
signed main()
{int t; cin >> t;while( t-- ){cin >> n;for(int i=1;i<n;i++){int l,r; scanf("%lld%lld",&l,&r);vec[l].push_back( r ), vec[r].push_back( l ); } dfs( 1,0 );cout << (( f[1][0]+f[1][2] )%mod+mod)%mod << endl;for(int i=1;i<=n;i++) vec[i].clear();}
}
The 15th Chinese Northeast Collegiate C. Vertex Deletion(树形dp)相关推荐
- The 15th Chinese Northeast Collegiate Programming Contest部分题解
The 15th Chinese Northeast Collegiate Programming Contest 目录 E. Easy Math Problem 题目思路 题目代码 I. Takea ...
- The 15th Chinese Northeast Collegiate Programming Contest 题解(CCPC压力测试?
CCPC压力测试用了这套题,和一个队友一起搞了.初期签到还算比较顺利,还碰到了挺多有意思的题目,做的好爽,但还是犯了很多低级错误,对于杭电要时时刻刻关同步或者scanf,并且写代码还是要仔细些. A. ...
- The 15th Chinese Northeast Collegiate Programming Contest
linkkkkkk 1001 Matrix 题意: 用 [ 1 , n 2 ] [1,n^2] [1,n2]的数填 n ∗ n n*n n∗n的矩阵,每个数字只能用一次,记 a i a_i ai表示 ...
- 【21.10.24】The 15th Chinese Northeast Collegiate Programming Contest题解
A. Matrix(组合数+数学) #include <bits/stdc++.h> using namespace std; #define mod 998244353 ll fac[1 ...
- The 15th Chinese Northeast Collegiate H - Loneliness(思维,构造)
LINK 注意 左上角是 ( 1 , 1 ) (1,1) (1,1),右下角是 ( n , n ) (n,n) (n,n) 如果无脑走下去,会乘上一个 2 n − 1 2^{n-1} 2n−1,早就爆 ...
- The 15th Chinese Northeast Collegiate Programming Contest D题
题目链接 大致题意: 给你一段含n个数字的序列,对于这段序列可以有m次操作. 操作有两种类型: 1.(1,L,R)表示将(L,R)区间的每个数加自身的lowbit值(若一个数为x,则其lowbit值为 ...
- The 15th Chinese Northeast Collegiate Programming Contest K.City
目录 题目: 思路: 代码: 题目: 原题: Lucida occupies n cities connected by m undirected roads, and each roa ...
- The 15th Chinese Northeast Collegiate Programming Contest - K.City
虽然不难,但是感觉很有意思的一道题,下面有几个点感觉还是挺妙的: · 并查集只能加边不能减边: ·对数据进行离线处理,方便我们进行排序处理(后面会解释): 首先数据的范围很大,如果我们每做一次判断都要 ...
- The 15th Chinese Northeast Collegiate Programming Contest. A Matrix
题意: $$用[1,2,...,n^2]填n\times n的矩阵,每个数字只能用一次,记:a_i为第i行的最小值:$$ $$S=a_1,a_2,...,a_n\cap{1,2,...,n};$$ $ ...
最新文章
- Educational Codeforces Round 54
- 解决数据库读写分离(转)
- Science:中科院微生物所向华/李明组揭示护卫CRISPR-Cas的全新毒素-抗毒素RNA系统
- 前Duolingo秦龙博士归国创业:情定K12个性化学习
- win7 将文件的背景色改为绿色
- 20个开源项目托管站点推荐
- 十进制转十六进制c语言_蓝桥杯十六进制转十进制,十进制转十六进制精简版(C++)...
- python for net_转:.NET 4.0 下使用 Python for .NET
- ActiveXObject ADODB.Stream封装
- macbook更新系统服务器,苹果电脑如何升级系统_苹果电脑怎么更新版本-win7之家...
- word论文排版操作
- appium+python 自动化测试:解决安卓系统双击问题——获取微信聊天内容
- zabbix邮箱告警
- RTL88X2BU网卡驱动失效,重新安装
- 博主称抖音屏蔽很多关键词致谐音梗大流行
- aspen模拟蒸发器_用Aspen Plus设计蒸发器例题
- c语言程序设计冒泡排序在哪,C语言程序设计冒泡排序教学案例杨进
- C# Socket模拟发送接收
- UVa 10507 - Waking up brain
- nexus7由Ubuntu刷回原厂安卓系统