LOJ 6497 图
LOJ 6497 图
题意
有图\(n\)点,每点可为黑或白,其中一些点颜色已定。
初时图无边,于每对\(i<j\),可由\(i\)向\(j\)连有向边,或不连。
称黑白相间之路径为交错路径。
求:有多少种情况交错路径有奇数条或偶数条。
数据范围:$$n\le2*10^5$$
注:单点也算一条交错路径。
思路
在后方新增一点\(k+1\),交错路径的数量怎么改变。
显然,新增的交错路径必须以新增的点结尾。
设\(sum_x\)表示以\(x\)结尾的交错路径的数量,\(S\)表示向\(k+1\)连边的且与\(k+1\)不同色的点的集合。
那么,新增交错路径为:
\]
这个应该比较好理解。
显然,我们只关注这个式子的奇偶性。
那么,关键在于奇点了。
对于同色点,我们可以随意连边。
对于异色且\(sum\)值为偶数的点,我们也可以随意连边。
然后,我们就可以\(O(n^3)\)DP了,记录当前有多少个黑色的奇数点,多少个白色的奇数点。
我们尝试优化一下。
可以发现,目前对奇数点的处理并不优。
我们发现,一个奇数点就足以改变整个状态。
于是,我们任意钦定一个异色奇数点,先不动。
其他奇数点随意连边。
观察我们现在的状态和期望转移到的状态有无差异,以此决定是否把钦定的这个点连上。
此时,我们有\(2^{k-1}\)种连法(除了钦定的点,其他随便连)
那么,如果没有一个异色奇数点呢?
无论如何连边,你都将改变交错路径的奇偶性。
此时,我们有\(2^{k}\)种连法。
设计状态
\]
表示到第\(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 图的更多相关文章
- LOJ 3057 「HNOI2019」校园旅行——BFS+图等价转化
题目:https://loj.ac/problem/3057 想令 b[ i ][ j ] 表示两点是否可行,从可行的点对扩展.但不知道顺序,所以写了卡时间做数次 m2 迭代的算法,就是每次遍历所有不 ...
- [LOJ#121]动态图连通性
[LOJ#121]动态图连通性 试题描述 这是一道模板题. 你要维护一张无向简单图.你被要求加入删除一条边及查询两个点是否连通. 0:加入一条边.保证它不存在. 1:删除一条边.保证它存在. 2:查询 ...
- LOJ 546: 「LibreOJ β Round #7」网格图
题目传送门:LOJ #546. 题意简述: 题目说的很清楚了. 题解: 将不包含起点或障碍物的连续的行或列缩成一行或一列,不会影响答案. 处理过后,新的网格图的行数和列数最多为 \(2k + 3\). ...
- loj#2255. 「SNOI2017」炸弹 线段树优化建图,拓扑,缩点
loj#2255. 「SNOI2017」炸弹 线段树优化建图,拓扑,缩点 链接 loj 思路 用交错关系建出图来,发现可以直接缩点,拓扑统计. 完了吗,不,瓶颈在于边数太多了,线段树优化建图. 细节 ...
- loj 1210 (求最少的加边数使得图变成强连通)
题目链接:http://lightoj.com/volume_showproblem.php?problem=1210 思路:首先是缩点染色,然后重建并且统计新图中的每个点的入度和出度,于是答案就是m ...
- 【LOJ 2144】「SHOI2017」摧毁「树状图」
LOJ 2144 84pts 首先\(op2\)很简单.直接并查集一搞就好了(话说我现在什么东西都要写个并查集有点...) 然后\(op0\)我不会,就直接\(O(n^2)\)枚举一下\(P\)这个人 ...
- LOJ#6354. 「CodePlus 2018 4 月赛」最短路[最短路优化建图]
题意 一个 \(n\) 个点的完全图,两点之间的边权为 \((i\ xor\ j)*C\) ,同时有 \(m\) 条额外单向路径,问从 \(S\) 到 \(T\) 的最短路. \(n\leq 10^5 ...
- LOJ 121 「离线可过」动态图连通性——LCT维护删除时间最大生成树 / 线段树分治
题目:https://loj.ac/problem/121 离线,LCT维护删除时间最大生成树即可.注意没有被删的边的删除时间是 m+1 . 回收删掉的边的节点的话,空间就可以只开 n*2 了. #i ...
- LOJ #121. 「离线可过」动态图连通性 LCT维护最大生成树
这个还是比较好理解的. 你考虑如果所有边构成一棵树的话直接用 LCT 模拟一波操作就行. 但是可能会出现环,于是我们就将插入/删除操作按照时间排序,然后依次进行. 那么,我们就要对我们维护的生成树改变 ...
随机推荐
- USACO training course Number Triangles 数塔 /// DP oj10122
题目大意: ...就是数塔 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 7+3+8+7+5=30 ...
- iOS逆向系列-脱壳
概述 通过iOS逆向系列-逆向App中使用class-dump工具导出App的Mach-O文件所有头文件.Hopper工具分析App的Mach-O文件代码大概实现.但是这些前体是App的Mach-O没 ...
- iOS开发系列-网络状态监控
概述 在网络应用中,需要对用户设别的网络状态进行实时监控,可以让用户了解自己的网络状态出现网络问题提示用户. 一般在网络状态不好的场景下需要做一些处理比如: WIFT/3G/4G网络:自动下载高清图. ...
- Hadoop 2.x 版本中的依赖 jar
- webpack英文文档
https://github.com/webpack/docs/wiki/contents
- uoj279 题目交流通道
题目:告诉你每两个点之间的最短路距离.构造每条边边权<=m的无向完全图.求有多少种不同边权的图满足最短路限制?n<=400. 标程: #include<cstdio> #inc ...
- [JZOJ5232] 【NOIP2017模拟A组模拟8.5】带权排序
题目 题目大意 有一个数列AAA,数列上的每个数都是在[li,ri][l_i,r_i][li,ri]范围内随机的数. 将这个数列进行稳定排序,得到每个位置在排序后的排名pip_ipi. f(A) ...
- 前端CSS样式操作
目录 字体和文字 设置标签的宽高 字体属性 文字的属性 文字对齐 text-align 文字装饰 text-decoration 首行缩进 text-indent 背景属性 背景图片 边框 画圆 di ...
- php链表笔记:单链表反转
<?php /** * Created by PhpStorm. * User: huizhou * Date: 2018/12/1 * Time: 11:41 */ /** * 1.链表的反转 ...
- python 解决抓取网页中的中文显示乱码问题
关于爬虫乱码有很多各式各样的问题,这里不仅是中文乱码,编码转换.还包括一些如日文.韩文 .俄文.藏文之类的乱码处理,因为解决方式是一致的,故在此统一说明. 网络爬虫出现乱码的原因 源网页编码和爬取下来 ...