LOJ 6497 图

题意

有图\(n\)点,每点可为黑或白,其中一些点颜色已定。

初时图无边,于每对\(i<j\),可由\(i\)向\(j\)连有向边,或不连。

称黑白相间之路径为交错路径。

求:有多少种情况交错路径有奇数条或偶数条。

数据范围:$$n\le2*10^5$$

注:单点也算一条交错路径。

思路

在后方新增一点\(k+1\),交错路径的数量怎么改变。

显然,新增的交错路径必须以新增的点结尾。

设\(sum_x\)表示以\(x\)结尾的交错路径的数量,\(S\)表示向\(k+1\)连边的且与\(k+1\)不同色的点的集合。

那么,新增交错路径为:

\[(\sum_{x\in S}{sum_x})+1
\]

这个应该比较好理解。

显然,我们只关注这个式子的奇偶性。

那么,关键在于奇点了。

对于同色点,我们可以随意连边。

对于异色且\(sum\)值为偶数的点,我们也可以随意连边。

然后,我们就可以\(O(n^3)\)DP了,记录当前有多少个黑色的奇数点,多少个白色的奇数点。

我们尝试优化一下。

可以发现,目前对奇数点的处理并不优。

我们发现,一个奇数点就足以改变整个状态。

于是,我们任意钦定一个异色奇数点,先不动。

其他奇数点随意连边。

观察我们现在的状态和期望转移到的状态有无差异,以此决定是否把钦定的这个点连上。

此时,我们有\(2^{k-1}\)种连法(除了钦定的点,其他随便连)

那么,如果没有一个异色奇数点呢?

无论如何连边,你都将改变交错路径的奇偶性。

此时,我们有\(2^{k}\)种连法。

设计状态

\[dp[i][0/1][0/1][0/1]
\]

表示到第\(i\)个点,此时交错路径总数的奇偶性,有无白色奇数点,有无黑色奇数点

随便转移即可。

代码

#include<bits/stdc++.h>
using namespace std;
const int mod=998244353;
const int sz=2e5+7;
int n,p;
int a[sz];
int qp[sz];
int f[sz][2][2][2];
void upd(int &x,int y){
x=x+y>=mod?x+y-mod:x+y;
}
void init(){
qp[0]=1;
for(int i=1;i<sz;i++) qp[i]=2*qp[i-1]%mod;
}
int main(){
init();
scanf("%d%d",&n,&p);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
f[0][0][0][0]=1;
for(int i=0;i<n;i++)
for(int k=0;k<=1;k++)
for(int x=0;x<=1;x++)
for(int y=0;y<=1;y++){
int cur=f[i][k][x][y];
if(!cur) continue;
if(a[i+1]==0||a[i+1]==-1){
if(x==0) upd(f[i+1][k^1][x][1],1ll*cur*qp[i]%mod);
else{
upd(f[i+1][k][x][y],1ll*cur*qp[i-1]%mod);
upd(f[i+1][k^1][x][1],1ll*cur*qp[i-1]%mod);
}
}
if(a[i+1]==1||a[i+1]==-1){
if(y==0) upd(f[i+1][k^1][1][y],1ll*cur*qp[i]%mod);
else{
upd(f[i+1][k][x][y],1ll*cur*qp[i-1]%mod);
upd(f[i+1][k^1][1][y],1ll*cur*qp[i-1]%mod);
}
}
}
int ans=0;
upd(ans,f[n][p][0][0]);
upd(ans,f[n][p][0][1]);
upd(ans,f[n][p][1][0]);
upd(ans,f[n][p][1][1]);
printf("%d\n",ans);
}

LOJ 6497 图的更多相关文章

  1. LOJ 3057 「HNOI2019」校园旅行——BFS+图等价转化

    题目:https://loj.ac/problem/3057 想令 b[ i ][ j ] 表示两点是否可行,从可行的点对扩展.但不知道顺序,所以写了卡时间做数次 m2 迭代的算法,就是每次遍历所有不 ...

  2. [LOJ#121]动态图连通性

    [LOJ#121]动态图连通性 试题描述 这是一道模板题. 你要维护一张无向简单图.你被要求加入删除一条边及查询两个点是否连通. 0:加入一条边.保证它不存在. 1:删除一条边.保证它存在. 2:查询 ...

  3. LOJ 546: 「LibreOJ β Round #7」网格图

    题目传送门:LOJ #546. 题意简述: 题目说的很清楚了. 题解: 将不包含起点或障碍物的连续的行或列缩成一行或一列,不会影响答案. 处理过后,新的网格图的行数和列数最多为 \(2k + 3\). ...

  4. loj#2255. 「SNOI2017」炸弹 线段树优化建图,拓扑,缩点

    loj#2255. 「SNOI2017」炸弹 线段树优化建图,拓扑,缩点 链接 loj 思路 用交错关系建出图来,发现可以直接缩点,拓扑统计. 完了吗,不,瓶颈在于边数太多了,线段树优化建图. 细节 ...

  5. loj 1210 (求最少的加边数使得图变成强连通)

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1210 思路:首先是缩点染色,然后重建并且统计新图中的每个点的入度和出度,于是答案就是m ...

  6. 【LOJ 2144】「SHOI2017」摧毁「树状图」

    LOJ 2144 84pts 首先\(op2\)很简单.直接并查集一搞就好了(话说我现在什么东西都要写个并查集有点...) 然后\(op0\)我不会,就直接\(O(n^2)\)枚举一下\(P\)这个人 ...

  7. LOJ#6354. 「CodePlus 2018 4 月赛」最短路[最短路优化建图]

    题意 一个 \(n\) 个点的完全图,两点之间的边权为 \((i\ xor\ j)*C\) ,同时有 \(m\) 条额外单向路径,问从 \(S\) 到 \(T\) 的最短路. \(n\leq 10^5 ...

  8. LOJ 121 「离线可过」动态图连通性——LCT维护删除时间最大生成树 / 线段树分治

    题目:https://loj.ac/problem/121 离线,LCT维护删除时间最大生成树即可.注意没有被删的边的删除时间是 m+1 . 回收删掉的边的节点的话,空间就可以只开 n*2 了. #i ...

  9. LOJ #121. 「离线可过」动态图连通性 LCT维护最大生成树

    这个还是比较好理解的. 你考虑如果所有边构成一棵树的话直接用 LCT 模拟一波操作就行. 但是可能会出现环,于是我们就将插入/删除操作按照时间排序,然后依次进行. 那么,我们就要对我们维护的生成树改变 ...

随机推荐

  1. 6_1.springboot2.x整合JDBC与数据源配置原理解析

    1.引言 对于数据访问层,无论是SQL还是NOSQL,Spring Boot默认采用整合 Spring Data的方式进行统一处理,添加大量自动配置,屏蔽了很多设置.引入各种xxxTemplate,x ...

  2. python 请求测试环境的https接口地址报SSL错误验证,访问不了

    解决文案: response = requests.post(url, data=payload, json=None, headers=headers,verify=False)print(resp ...

  3. html--浮动高度塌陷问题

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  4. vim的个性化配置(方便编程)

    在用户主目录下新建vimrc即可.例如: vim ~/.vimrc 然后复制进去即可.   配置如下: "关闭vim一致性原则 set nocompatible "显示行号 set ...

  5. field方法属于模型的连贯操作方法之一

    field方法属于模型的连贯操作方法之一,主要目的是标识要返回或者操作的字段,可以用于查询和写入操作. 1.用于查询 指定字段 在查询操作中field方法是使用最频繁的. $Model->fie ...

  6. 牛客网在线判题系统JavaScript(V8)使用

    JavaScript作为一种弱类型的编程语言,语法和C/C++.JAVA等存在差别,但是对于大部算法题,不只是C/C++.JAVA,也依然可以使用JavaScript来实现.所以在牛客网中,如果你喜欢 ...

  7. 深入浅出Mybatis系列(二)---配置简介(mybatis源码篇)[转]

    上篇文章<深入浅出Mybatis系列(一)---Mybatis入门>, 写了一个Demo简单体现了一下Mybatis的流程.本次,将简单介绍一下Mybatis的配置文件: 上次例子中,我们 ...

  8. Docker系列(十六):搭建Openshift环境

    目的: 搭建Linux下的Openshift环境. 参考资料: 开源容器云OpenShift 构建基于Kubernetes的企业应用云平台 ,陈耿 ,P253 ,2017.06 .pdf 下载地址:h ...

  9. <b> <i> 标记

    <b></b> bold 加粗 <i></i> italic 斜线 : 对应Word文档的 I   斜体 <u></u>unde ...

  10. Sql Server 2005主机和镜像切换SQL语句

    --1.主备互换 --主机执行: USE master; ALTER DATABASE <DatabaseName> SET PARTNER FAILOVER; --2.主服务器Down掉 ...