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\) 个按钮中处于激活状态 ...
随机推荐
- 苹果系统 的 qq浏览器 和 qq内置浏览器 无法使用 websocket 的 妥协方案
没错,就是用不了,js脚本不执行,更别说服务器运行 onopen函数了!!! 怎么办...搞了一天,仍然找不到连接的方法!!! 幸运的是仅仅苹果系统 的无法使用 ,安卓的却可以,奇了怪了 哈皮 ,那我 ...
- centos7 alias别名永久生效
进入/etc/profile.d/目录 cd /etc/profile.d/ 在profile.d目录随意创建一个sh文件,例如alias_test.sh vi alias_test.sh##里面的内 ...
- 安装Apache-storm-0.9.1-incubating图解教程
注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6596214331988247054/ 安装步骤 (1) 安装Zookeeper集群,可以参考前一篇文章,本文已安装 ...
- Java 中如何实现线程间通信
世界以痛吻我,要我报之以歌 -- 泰戈尔<飞鸟集> 虽然通常每个子线程只需要完成自己的任务,但是有时我们希望多个线程一起工作来完成一个任务,这就涉及到线程间通信. 关于线程间通信本文涉及到 ...
- Mysql存储过程二
1.MySQL中创建存储过程时通过DEFINER和SQL SECURITY设置访问权限 procedure与function.trigger等创建时紧接着CREATE都有个definer可选项,该de ...
- leetcode 55. 跳跃游戏 及 45. 跳跃游戏 II
55. 跳跃游戏 问题描述 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 判断你是否能够到达最后一个位置. 示例 1: 输入: [2,3,1, ...
- Java基础(十)——枚举与注解
一.枚举 1.介绍 枚举类:类的对象只有有限个,确定的.当需要定义一组常量时,强烈建议使用枚举类.如果枚举类中只有一个对象,则可以作为单例模式的实现. 使用 enum 定义的枚举类默认继承了 java ...
- VUE3 之 组件传参
1. 概述 韦奇定律告诉我们:大部分人都很容易被别人的话所左右,从而开始动摇.怀疑,最终迷失自我.因此我们要努力的坚定信念,相信自己,才不会被周围的环境所左右,才能取得最终的胜利. 言归正传,之前我们 ...
- go面试题-基础类
go基础类 1. go优势 * 天生支持并发,性能高 * 单一的标准代码格式,比其它语言更具可读性 * 自动垃圾收集比java和python更有效,因为它与程序同时执行 go数据类型 int stri ...
- 拒绝编译等待 - 动态研发模式 ARK
作者:字节跳动终端技术--徐纪光 背景 iOS 业界研发模式多为 CocoaPods + Xcode + Git 的多仓组件化开发模型.为追求极致的研发体验.提升研发效率,对该研发模式进行了大量优化, ...