\(\mathcal{Description}\)

  OurOJ.

  有 \(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)\);

答案则为

\[\sum_{2\mid(w+b)}f(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」人生的更多相关文章

  1. Solution -「ZJOI 2020」「洛谷 P6631」序列

    \(\mathcal{Description}\)   Link.   给定一个长为 \(n\) 的非负整数序列 \(\lang a_n\rang\),你可以进行如下操作: 取 \([l,r]\),将 ...

  2. Solution -「JOISC 2020」「UOJ #509」迷路的猫

    \(\mathcal{Decription}\)   Link.   这是一道通信题.   给定一个 \(n\) 个点 \(m\) 条边的连通无向图与两个限制 \(A,B\).   程序 Anthon ...

  3. Solution -「NOI 2020」「洛谷 P6776」超现实树

    \(\mathcal{Description}\)   Link.   对于非空二叉树 \(T\),定义 \(\operatorname{grow}(T)\) 为所有能通过若干次"替换 \( ...

  4. 「NOIP 2020」微信步数(计数)

    「NOIP 2020」微信步数(Luogu P7116) 题意: 有一个 \(k\) 维场地,第 \(i\) 维宽为 \(w_i\),即第 \(i\) 维的合法坐标为 \(1, 2, \cdots, ...

  5. Solution -「ARC 104E」Random LIS

    \(\mathcal{Description}\)   Link.   给定整数序列 \(\{a_n\}\),对于整数序列 \(\{b_n\}\),\(b_i\) 在 \([1,a_i]\) 中等概率 ...

  6. Solution -「简单 DP」zxy 讲课记实

    魔法题位面级乱杀. 「JOISC 2020 Day4」治疗计划 因为是不太聪明的 Joker,我就从头开始理思路了.中途也会说一些和 DP 算法本身有关的杂谈,给自己的冗长题解找借口. 首先,治疗方案 ...

  7. Solution -「SV 2020 Round I」SA

    \(\mathcal{Description}\)   求出处 owo.   给定一个长度为 \(n\),仅包含小写字母的字符串 \(s\),问是否存在长度为 \(n\),仅包含小写字母的字符串 \( ...

  8. Solution -「SV 2020 Round I」「SRM 551 DIV1」「TC 12141」SweetFruits

    \(\mathcal{Description}\)   link.   给定 \(n\) 个水果,每个结点可能有甜度 \(v_i\),或不甜(\(v_i=-1\)).现在把这些水果串成一棵无根树.称一 ...

  9. Solution -「USACO 2020.12 P」Spaceship

    \(\mathcal{Description}\)   Link.   Bessie 在一张含 \(n\) 个结点的有向图上遍历,站在某个结点上时,她必须按下自己手中 \(m\) 个按钮中处于激活状态 ...

随机推荐

  1. Centos7 文件权限理解(持续更新)

    后期排版,边学边记边敲 用户详情分析 管理员用户 root  0 虚拟用户 nobody  1-999 普通用户 test001  1000+ 输入ll命令查看当前目录文件详情 根据这张图片可知,目录 ...

  2. Electron+Vue开发跨平台桌面应用

    Electron+Vue开发跨平台桌面应用 xiangzhihong发布于 2019-12-23 虽然B/S是目前开发的主流,但是C/S仍然有很大的市场需求.受限于浏览器的沙盒限制,网页应用无法满足某 ...

  3. linux 下安装PostgreSql 并配置远程访问

    1.官网下载PostgreSql 安装包 (https://www.enterprisedb.com/downloads/postgres-postgresql-downloads) 我下载的是 9. ...

  4. 微服务探索之路02篇liunx ubuntu服务器部署k8s(kubernetes)-kubernetes/dashboard

    本章介绍所需环境:ubuntu18.04,建立在上一篇微服务探索之路01篇已经安装了docker的基础上. 1 替换k8s镜像源为国内镜像 进入目录 cd /etc/apt/sources.list. ...

  5. golang中如何退出goroutine

    package main import ( "fmt" "runtime" "time" ) func main() { // 用gorou ...

  6. Servlet-ServletConfig类使用介绍

    ServletConfig类(Servlet程序的配置信息类) Servlet 程序和 ServletConfig对象都是由 Tomcat负责创建,我们负责使用. Servlet 程序默认是第一次访问 ...

  7. cnpm安装教程

    安装cnpm,输入以下命令: sudo npm install -g cnpm --registry=https://registry.npm.taobao.org 输入cnpm -v ,检测是否正常 ...

  8. 简单socket服务器编程

    package socket; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; ...

  9. 前端vue-TinyMCE富文本编辑器表情插件报错解决

    最近项目中需要使用文本编辑器,比较了下最终选择了TinyMCE这款富文本编辑器.我安装的是TinyMCE v5但是在使用表情插件的时候,表情一直都出不来,报错信息如下: Uncaught Syntax ...

  10. 在 Prim 算法中使用 pb_ds 堆优化

    在 Prim 算法中使用 pb_ds 堆优化 Prim 算法用于求最小生成树(Minimum Spanning Tree,简称 MST),其本质是一种贪心的加点法.对于一个各点相互连通的无向图而言,P ...