[atARC121F]Logical Operations on Tree
(特判$n=1$的情况)
当确定权值和操作后,如何判定是否合法——
考虑一个度为1的节点,对其权值即其对应边的边操作分类讨论:
$1\or$,显然只需要最后选择这条边即可,一定合法
$1\and$或$0\or$,显然这条边没有意义,不妨直接选择
$0\and$,将最终的结果变为0,显然不如初始的值为0(结果仍为0也不劣),因此也不妨直接选择
综上,有以下策略:若存在$1\or$的情况一定合法,否则不断选择某一条度为1的点对应的边即可
然后,进行树形dp即可,令$f_{k,0/1/2}$表示以$k$为根的子树中最终$k$的权值为0/1且未出现$1\or$的情况和出现$1\or$的方案数(仅考虑子树内部),转移即
$$
\begin{cases}f_{k,0}=f_{k,0}(2f_{son,0}+f_{son,1})+f_{k,1}f_{son,0}\\f_{k,1}=f_{k,1}(f_{son,0}+f_{son,1})\\f_{k,2}=(f_{k,0}+f_{k,1})(f_{son,1}+2f_{son,2})+2f_{k,2}(f_{son,0}+f_{son,1}+f_{son,2})\end{cases}
$$
初始状态为$f_{k,0}=f_{k,1}=1$,最终答案为$f_{rt,1}+f_{rt,2}$
时间复杂度为$o(n)$,可以通过

1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 100005
4 #define mod 998244353
5 #define ll long long
6 struct Edge{
7 int nex,to;
8 }edge[N<<1];
9 int E,n,x,y,ans,head[N];
10 ll g[3],f[N][3];
11 void add(int x,int y){
12 edge[E].nex=head[x];
13 edge[E].to=y;
14 head[x]=E++;
15 }
16 void dfs(int k,int fa){
17 f[k][0]=f[k][1]=1;
18 for(int i=head[k];i!=-1;i=edge[i].nex){
19 int v=edge[i].to;
20 if (v!=fa){
21 dfs(v,k);
22 memcpy(g,f[k],sizeof(g));
23 f[k][0]=(g[0]*(2*f[v][0]+f[v][1])+g[1]*f[v][0])%mod;
24 f[k][1]=g[1]*(f[v][0]+f[v][1])%mod;
25 f[k][2]=((g[0]+g[1])*(f[v][1]+2*f[v][2])%mod+2*g[2]*(f[v][0]+f[v][1]+f[v][2]))%mod;
26 }
27 }
28 }
29 int main(){
30 scanf("%d",&n);
31 memset(head,-1,sizeof(head));
32 for(int i=2;i<=n;i++){
33 scanf("%d%d",&x,&y);
34 add(x,y);
35 add(y,x);
36 }
37 dfs(1,0);
38 printf("%d",(f[1][1]+f[1][2])%mod);
39 }
[atARC121F]Logical Operations on Tree的更多相关文章
- C语言之Bit-wise Operation和Logical Operation
首先第一点:十六进制位运算和逻辑运算 都是先转化二进制,后输出结果(十六进制,二或十)Bit-Wise Operations (位运算)包括:& 按位与 | 按位或 ^ 按位异或 ~ 取反 & ...
- OpenCV Mat&Operations
/*M/////////////////////////////////////////////////////////////////////////////////////////// IMPOR ...
- Microsoft SQL Server Trace Flags
Complete list of Microsoft SQL Server trace flags (585 trace flags) REMEMBER: Be extremely careful w ...
- Oracle12c版本中未归档隐藏参数
In this post, I will give a list of all undocumented parameters in Oracle 12.1.0.1c. Here is a query ...
- Execution Plan 执行计划介绍
后面的练习中需要下载 Demo 数据库, 有很多不同的版本, 可以根据个人需要下载. 下载地址 -http://msftdbprodsamples.codeplex.com/ 1. 什么是执行计划 ...
- C++ Core Guidelines
C++ Core Guidelines September 9, 2015 Editors: Bjarne Stroustrup Herb Sutter This document is a very ...
- 数据库系统概述(Data Model、DBMS、DBS、RDBS、Structured Query Language)
数据Data 描述事物的符号记录成为数据. 数据是数据库中存储的基本对象. 除了基本的数字之外.像图书的名称.价格.作者都可以称为数据. 将多种数据记录列成一张表.通过数据表管理数据. 每一行的数 ...
- sqlmap用法
用法 Usage: python sqlmap.py [options] Options: -h, --help Show basic help message and exit -hh Show a ...
- UBIFS - UBI File-System
参考:http://www.linux-mtd.infradead.org/doc/ubifs.html#L_raw_vs_ftl UBIFS - UBI File-System Table of c ...
随机推荐
- Ysoserial Commons Collections3分析
Ysoserial Commons Collections3分析 写在前面 CommonsCollections Gadget Chains CommonsCollection Version JDK ...
- FFT 的一些技巧
三次变两次 FFT 我们发现: \[(F(x)+iG(x))^2=F(x)^2-G(x)^2+2iF(x)G(x) \] 也就是说,我们把 \(F(x)\) 作为实部,\(G(x)\) 作为虚部,那么 ...
- spoj839 Optimal Marks(最小割,dinic)
题目大意: 给你一个无向图\(G(V,E)\). 每个顶点都有一个int范围内的整数的标记. 不同的顶点可能有相同的标记. 对于边\((u,v)\),我们定义\(Cost(u,v)=mark [u]\ ...
- 模拟赛T2 交换 解题报告
模拟赛T2 交换 解题报告 题目大意: 给定一个序列和若干个区间,每次从区间中选择两个数修改使字典序最小. \(n,m\) 同阶 \(10^6\) 2.1 算法 1 按照题意模拟,枚举交换位置并比较. ...
- Tomcat实现自定义类加载器
什么是类加载器? 这是官方给的定义 在 Java 虚拟机的实现中,初始类可以作为命令行参数提供. 或者,该实现可以提供一个初始类,该类设置一个类加载器,该类加载器依次加载应用程序. 初始类的其他选择也 ...
- Kubernetes Job Controller 原理和源码分析(一)
概述什么是 JobJob 入门示例Job 的 specPod Template并发问题其他属性 概述 Job 是主要的 Kubernetes 原生 Workload 资源之一,是在 Kubernete ...
- jquery-无缝滚动
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 【UE4 C++】碰撞检测与事件绑定
概念 碰撞对象通道与预设 默认提供碰撞对象类型,如 WorldStatic.WorldDynamic等.允许用户自定义 默认提供碰撞预设,如 NoCollision.BloackAll.Overlap ...
- js_数据类型转换
转整数----parseInt(string,radix) 1)类似于从左往右匹配数字,直到匹配到非数字结束,并返回匹配到的数字.同parseFloat(). parseInt("123&q ...
- linux下文件特殊权限设置位S和沾附位T(转载)
今天在创建文件的时候,发现了文件权限末尾有个T,之前没留意过,后来又用c创建(open)了两个文件来查看,在我没有指定权限(省略open的第三个参数)的时候,有时还会出现S,虽然还没弄懂什么时候会出现 ...