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. 看 《android权威编程指南》 的笔记

    Android 编译工具 确保ant已安装并正常运行,android sdk的tools/和platform-tools目录包含在可执行文件的搜索路径中 切换到项目目录并执行以下命令: android ...

  2. [JZOJ3168] 【GDOI2013模拟3】踢足球

    题目 描述 题目大意 有两个队伍,每个队伍各nnn人. 接到球的某个人会再下一刻随机地传给自己人.敌人和射门,射门有概率会中. 每次射门之后球权在对方111号选手. 某个队伍到了RRR分,或者总时间到 ...

  3. java.util.concurrent中的几种同步工具类

    java.util.concurrent并发包中提供了一系列的的同步工具类,这些基础类不管是否能在项目中使用到,了解一下使用方法和原理对java程序员来说都是有必要的.博主在看<java并发编程 ...

  4. 洛谷P3376【模板】网络最大流 ISAP

    这篇博客写得非常好呀. 传送门 于是我是DCOI这一届第一个网络流写ISAP的人了,之后不用再被YKK她们嘲笑我用Dinic了!就是这样! 感觉ISAP是会比Dinic快,只分一次层,然后不能增广了再 ...

  5. coreseek 基与Sphinx 的全文索引

    假设有两张那个表,分别为articles,article_photos两张表.搜索的时候,要匹配articles.title.articles.intro.article_photos.caption ...

  6. C++之memset函数

    可参考: C++中memset函数的用法 C++中memset函数的用法 C++中memset()函数的用法详解 c/c++学习系列之memset()函数 透彻分析C/C++中memset函数 mem ...

  7. sip会话流程以及sip介绍(2)

    下面我们通过一个简单的场景例子来简单介绍一下 SIP 会话流程. Tom 和 Jerry 是非常好的伙伴,Tom 在他的 PC 上使用一个 SIP 的应用程序呼叫 Internet 上另一个 SIP ...

  8. java代码优化写法(转摘)

    本文源地址:https://blog.csdn.net/syc001/article/details/72841650 可供程序利用的资源(内存.CPU时间.网络带宽等)是有限的,优化的目的就是让程序 ...

  9. C#用API可以改程序名字

    [DllImport("user32.dll", EntryPoint = "FindWindow")] public static extern int Fi ...

  10. spark编程入门-idea环境搭建

    原文引自:http://blog.csdn.net/huanbia/article/details/69084895 1.环境准备 idea采用2017.3.1版本. 创建一个文件a.txt 2.构建 ...