Solution -「FJWC 2020」人生
\(\mathcal{Description}\)
有 \(n\) 个结点,一些结点有染有黑色或白色,其余待染色。将 \(n\) 个结点染上颜色并连接有向边,求有多少个不同(结点颜色不同或边不同)的图,满足:
- \(\forall \lang u,v\rang\in E,~1\le u<v\le n\);
- 相邻两点颜色不同的路径条数(包括单点)为奇数。
答案对 \(998244353\) 取模。
\(n\le2\times10^5\)。
\(\mathcal{Solution}\)
DP,显然从后往前考虑每个结点的连边情况。为方便理解,不妨设 \(g(u)\) 表示在某个确定的图上,从 \(u\) 出发的合法路径条数。发现对 \(g(u)\) 的奇偶性有影响的连边 \(\lang u,v\rang\) 中,应满足 \(v\) 与 \(u\) 异色且 \(2\not\mid g(v)\),且我们只关心如此 \(v\) 的个数。
然则需求信息量较小,可以开始 DP,令 \(f(i,w,b)\) 表示已为大于等于 \(i\) 的结点染好颜色,且白色的满足 \(2\not\mid g(v)\) 的 \(v\) 有 \(w\) 个,黑色的满足 \(2\not\mid g(v)\) 的 \(v\) 有 \(b\) 个。对于 \(f(i+1,w,b)\),一共已经确定完 \(c=n-i+1\) 个结点,不妨设 \(i\) 的颜色为白色,则有转移:
- \(f(i,w,b)\longleftarrow [b\not=0]2^{c-1}f(i+1,w,b)\);
- \(f(i,w+1,b)\longleftarrow2^{c-[b\not=0]}f(i+1,w,b)\);
答案则为
\]
注意到转移仅与 \(w,b\) 是否为 \(0\) 有关,答案仅与 \(w,b\) 的奇偶性有关,所以可以优化 \(f(i,w\in[0,2],b\in[0,2])\) 为:已为大于等于 \(i\) 的结点染好颜色,且白色的满足 \(2\not\mid g(v)\) 的 \(v\) 未出现 / 出现奇数次 / 出现偶数次,黑色同理,就能转移啦。
复杂度 \(\mathcal O(n)\),带约 \(10\) 倍常数。
\(\mathcal{Code}\)
/* Clearink */
#include <cstdio>
#define rep( i, l, r ) for ( int i = l, repEnd##i = r; i <= repEnd##i; ++i )
#define per( i, r, l ) for ( int i = r, repEnd##i = l; i >= repEnd##i; --i )
const int MAXN = 2e5, MOD = 998244353;
int n, a[MAXN + 5], pwr[MAXN + 5], f[MAXN + 5][3][3];
// 0: none, 1: odd, 2: even.
inline int mul( const long long a, const int b ) { return a * b % MOD; }
inline int add( int a, const int b ) { return ( a += b ) < MOD ? a : a - MOD; }
inline void addeq( int& a, const int b ) { ( a += b ) >= MOD && ( a -= MOD ); }
int main() {
freopen( "life.in", "r", stdin );
freopen( "life.out", "w", stdout );
scanf( "%d", &n ), pwr[0] = 1;
rep ( i, 1, n ) {
scanf( "%d", &a[i] );
pwr[i] = add( pwr[i - 1], pwr[i - 1] );
}
f[n + 1][0][0] = 1;
per ( i, n + 2, 2 ) {
int all = n - i + 1, cur;
rep ( w, 0, 2 ) rep ( b, 0, 2 ) {
if ( !( cur = f[i][w][b] ) ) continue;
if ( !a[i - 1] ) {
addeq( f[i - 1][w][b], mul( cur, b ? pwr[all - 1] : 0 ) );
addeq( f[i - 1][( w & 1 ) + 1][b], mul( cur, pwr[all - !!b] ));
} else if ( ~a[i - 1] ) {
addeq( f[i - 1][w][b], mul( cur, w ? pwr[all - 1] : 0 ) );
addeq( f[i - 1][w][( b & 1 ) + 1], mul( cur, pwr[all - !!w] ));
} else {
addeq( f[i - 1][w][b], mul( cur, b ? pwr[all - 1] : 0 ) );
addeq( f[i - 1][w][b], mul( cur, w ? pwr[all - 1] : 0 ) );
addeq( f[i - 1][( w & 1 ) + 1][b], mul( cur, pwr[all - !!b] ));
addeq( f[i - 1][w][( b & 1 ) + 1], mul( cur, pwr[all - !!w] ));
}
}
}
int ans = 0;
rep ( w, 0, 2 ) rep ( b, 0, 2 ) {
if ( ( w + b ) & 1 ) {
addeq( ans, f[1][w][b] );
}
}
printf( "%d\n", ans );
return 0;
}
Solution -「FJWC 2020」人生的更多相关文章
- Solution -「ZJOI 2020」「洛谷 P6631」序列
\(\mathcal{Description}\) Link. 给定一个长为 \(n\) 的非负整数序列 \(\lang a_n\rang\),你可以进行如下操作: 取 \([l,r]\),将 ...
- Solution -「JOISC 2020」「UOJ #509」迷路的猫
\(\mathcal{Decription}\) Link. 这是一道通信题. 给定一个 \(n\) 个点 \(m\) 条边的连通无向图与两个限制 \(A,B\). 程序 Anthon ...
- Solution -「NOI 2020」「洛谷 P6776」超现实树
\(\mathcal{Description}\) Link. 对于非空二叉树 \(T\),定义 \(\operatorname{grow}(T)\) 为所有能通过若干次"替换 \( ...
- 「NOIP 2020」微信步数(计数)
「NOIP 2020」微信步数(Luogu P7116) 题意: 有一个 \(k\) 维场地,第 \(i\) 维宽为 \(w_i\),即第 \(i\) 维的合法坐标为 \(1, 2, \cdots, ...
- Solution -「ARC 104E」Random LIS
\(\mathcal{Description}\) Link. 给定整数序列 \(\{a_n\}\),对于整数序列 \(\{b_n\}\),\(b_i\) 在 \([1,a_i]\) 中等概率 ...
- Solution -「简单 DP」zxy 讲课记实
魔法题位面级乱杀. 「JOISC 2020 Day4」治疗计划 因为是不太聪明的 Joker,我就从头开始理思路了.中途也会说一些和 DP 算法本身有关的杂谈,给自己的冗长题解找借口. 首先,治疗方案 ...
- Solution -「SV 2020 Round I」SA
\(\mathcal{Description}\) 求出处 owo. 给定一个长度为 \(n\),仅包含小写字母的字符串 \(s\),问是否存在长度为 \(n\),仅包含小写字母的字符串 \( ...
- Solution -「SV 2020 Round I」「SRM 551 DIV1」「TC 12141」SweetFruits
\(\mathcal{Description}\) link. 给定 \(n\) 个水果,每个结点可能有甜度 \(v_i\),或不甜(\(v_i=-1\)).现在把这些水果串成一棵无根树.称一 ...
- Solution -「USACO 2020.12 P」Spaceship
\(\mathcal{Description}\) Link. Bessie 在一张含 \(n\) 个结点的有向图上遍历,站在某个结点上时,她必须按下自己手中 \(m\) 个按钮中处于激活状态 ...
随机推荐
- springboot插件打包跳过单元测试
只需在pom.xml添加如下即可 <skipTests>true</skipTests> pom文件如下 <?xml version="1.0" en ...
- Mysql高性能优化
一.背景 最近公司项目添加新功能,上线后发现有些功能的列表查询时间很久.原因是新功能用到旧功能的接口,而这些旧接口的 SQL 查询语句关联5,6张表且编写不够规范,导致 MySQL 在执行 SQL 语 ...
- BitMap算法知识笔记以及在大数据方向的使用
概述 所谓的BitMap算法就是位图算法,简单说就是用一个bit位来标记某个元素所对应的value,而key即是该元素,由于BitMap使用了bit位来存储数据,因此可以大大节省存储空间,这是很常用的 ...
- 使用nexus搭建一个maven私有仓库
使用nexus搭建一个maven私有仓库 大家好,我是程序员田同学.今天带大家搭建一个maven私有仓库. 很多公司都是搭建自己的Maven私有仓库,今天就带大家使用nexus搭建一个自己的私有仓库, ...
- day4 对偶数、偶数位的操作
1.函数fun()的功能:从低位开始取出整形变量s中偶数位上的数,依次构成一个新数放在t中.高位仍在高位. 效果理想:但是经测试的时候出现了错误 输入987654321时,打印出来的却是18681.经 ...
- Solon Web 开发,一、开始
Solon Web 开发 一.开始 二.开发知识准备 三.打包与运行 四.请求上下文 五.数据访问.事务与缓存应用 六.过滤器.处理.拦截器 七.视图模板与Mvc注解 八.校验.及定制与扩展 九.跨域 ...
- Unable to open 'free_base.cpp': Unable to read file 'c:\Program Files\Microsoft VS Code\minkernel\crts\ucrt\src\appcrt\heap\free_base.cpp'
问题 vscode编写C++程序,使用microsoft C++ Unable to open 'cvt.cpp': Unable to read file 'c:\Program Files\Mic ...
- centos下python2升级为python3
1.下载 下载地址 https://www.python.org/downloads/release/python-353/ 选择"Gzipped source tarball"这 ...
- 数据库查询语句遇到:Unknown column 'XXXX' in 'where clause'解决方法
数据库查询语句遇到:Unknown colunm 'XXX' in 'where clause'解决方法 根本原因:可能是sql语句所用到的数据类型错误(int与String)弄错- 我的情况: 在网 ...
- python 小兵 三元运算符
1 if 条件成立: 2 val = 1 3 else: 4 val = 2 改成三元运算: val = 1 if 条件成立 else 2 举例 条件成立走左边,条件成立走右边 a = 2 b = 5 ...