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. Java学习之创建对象内存使用机制

    Java内存空间分两种,一种是栈内存,有多个,一种是堆内存,只有一个,在堆内存中又有一块方法区. 方法区中存储的是:类的信息(类名,类的直接父类,类的访问修饰符),类变量,类方法代码,实例方法代码,常 ...

  2. linux 系统优化初始化配置

    一.系统优化配置 1.修改yum源  配置国内yum源 阿里云yum源地址 #CentOS 5.x wget -O /etc/yum.repos.d/CentOS-Base.repo http://m ...

  3. js怎样截取字符串后几位以及截取字符串前几位

    想要截取字符串前几位与后几位,主要代码如下 截取字符串前几位 var disName ='开心一族漂亮家园'; var shortName = disName.substring(0,5); cons ...

  4. P++ 1.0.5

    #include<bits/stdc++.h> #define begin { #define end } #define while while( #define if if( #def ...

  5. TF坐标变换

    一.什么是TF  二.TF使用方法 三.TF包内的指令工具 四.相关API 1.广播变换发布坐标之间的坐标关系   #include <ros/ros.h> #include <tf ...

  6. 19-11-10-Night

    关于$Miemeng$,它死了. 大家有没有记得我在暑假里曾经写过一个著名模数? const int Mod=998224353; 现在有续集了(捂脸)(改不过题.jpg) const int Mod ...

  7. CDN与智能DNS原理和应用

    1.cdn概念,DNS概念 CDN:Centent Delivery Network(内容分发网络) 使用户可以就近取得所需内容,提高用户访问网站相应速度 CDN=更智能的镜像+缓存+流量导流: DN ...

  8. day 46 Javascript学习

    Javascript学习   JavaScript概述 ECMAScript和JavaScript的关系 1996年11月,JavaScript的创造者--Netscape公司,决定将JavaScri ...

  9. ASCII对照

    标准表 Bin (二进制) Oct (八进制) Dec (十进制) Hex (十六进制) 缩写/字符 解释 0000 0000 00 0 0x00 NUL(null) 空字符 0000 0001 01 ...

  10. SPRINGBOOT配置事物注解和@MAPPER注意

    MAPPER接口要使用@Mapper注解,不能用@Compent @Repository,否则没有效果 一.开启事物 在启动类上加 @EnableTransactionManagement //如果m ...