【JZOJ5553】【20190625】谜
题目
给出一个\(2\times n\)个点的二分图的邻接矩阵\(M\)
以及\(m\)个行替换元,\(k\)个列替换元
\(q\)次询问:op u v 表示用第v个行/列替换元去替换矩阵的第u行/列
对初始以及每个操作矩阵输出完全匹配的方案数mod 2 的值
\(n ,m,k \le 10^3 \ , \ q \le 10^5\)
题解
在mod 2 的意义下-1=1,所以完全匹配的方案数=\(det(M)\)
bitset 暴力高斯消元\(O(q\frac{n^3}{\omega})\)
询问相当于每次替换一个行或者列,询问矩阵是否满秩
考虑预处理出所有询问的答案
由于替换某一行或者列最多使矩阵的秩加减1
1.如果原矩阵的秩为\(n\):
由于矩阵满秩,那么对于每一个\(n\)阶向量都可以被线性表示;
对于每一个询问预处理出这样的表示,可以替换的就是系数为1的位置
2.如果原矩阵的秩为\(n-1\):
一定存在并且仅存在一组线性相关的向量,它们的异或和为0向量
在原来\(n\)个向量中,任意去掉其中的一个都是一个线性无关的组
对原矩阵消元得到一个基,对一个询问能被线性表出,那么无论如何替换一定不满秩
否则出现了一个\(n \)个向量的线性无关组,可以替换的就是最开始存在的线性相关那组向量中的任意一个
时间复杂度:\(O(\frac{n^3}{\omega})\)
#include<bits/stdc++.h>
using namespace std;
const int N=1010;
typedef bitset<1010> Bit;
int n;
char s[N];
Bit a[N],b[N],p[N],q[N],c,ans[2][100000];
int gauss(Bit*A,Bit*B){
int i=1,j=1;
for(;i<=n&&j<=n;++i,++j){
int pos=i;while(pos<=n&&!A[pos][j])++pos;
if(pos>n){i--;continue;}
if(i!=pos)swap(A[i],A[pos]),swap(B[i],B[pos]);
for(int k=i+1;k<=n;++k)if(A[k][j])A[k]^=A[i],B[k]^=B[i];
}
return i<n?0:i==n?2:1;
}
void get(int fg,Bit*A,Bit*B,Bit C,Bit&re){
int i=1,j=1,pos=0;
for(;i<=n&&j<=n;++i,++j){
if(!A[i][j]){pos=j,i--;continue;}
if(C[j])C^=A[i],re^=B[i];
}
if(fg==2){
if(C.test(pos))re=B[n];
else re.reset();
}
}
int main(){
freopen("maze.in","r",stdin);
freopen("maze.out","w",stdout);
int m,k,Q;scanf("%d",&n);
for(int i=1;i<=n;++i){
scanf("%s",s+1);p[i].set(i);q[i].set(i);
for(int j=1;j<=n;++j)if(s[j]=='1')a[i].set(j),b[j].set(i);
}
int fg=gauss(a,p);gauss(b,q);
//printf("%d:\n",fg);
scanf("%d%d",&m,&k);
for(int i=1;i<=m;++i){
scanf("%s",s+1);c.reset();
for(int j=1;j<=n;++j)if(s[j]=='1')c.set(j);
if(!fg)continue;
get(fg,a,p,c,ans[0][i]);
}
for(int i=1;i<=k;++i){
scanf("%s",s+1);c.reset();
for(int j=1;j<=n;++j)if(s[j]=='1')c.set(j);
if(!fg)continue;
get(fg,b,q,c,ans[1][i]);
}
puts(fg&1?"1":"0");
scanf("%d",&Q);
for(int i=1,op,u,v;i<=Q;++i){
scanf("%d%d%d",&op,&u,&v);
printf("%d\n",ans[op][v].test(u));
}
return 0;
}
【JZOJ5553】【20190625】谜的更多相关文章
- pythonchallenge 解谜 Level 0
解谜地址: http://www.pythonchallenge.com/pc/def/0.html 这题没什么难度,意思就是得到2的38次方的值,然后,替换 http://www.pythoncha ...
- pythonchallenge 解谜
所有代码均使用python 3.5.1 版本 最近在学python,闲来无事觉得这个解谜还挺有意思. 解谜网址 http://www.pythonchallenge.com/ 接下来会写破解教程~
- 揭秘JavaScript中谜一样的this
揭秘JavaScript中谜一样的this 在这篇文章里我想阐明JavaScript中的this,希望对你理解this的工作机制有一些帮助.作为JavaScript程序员学习this对于你的发展有 ...
- Activity的"singleTask"之谜
官方文档称 以这种方式启动的Activity总是属于一个任务的根Activity.果真如此吗?本文将为你解开Activity的"singleTask"之谜. 任务(Task)是个什 ...
- Microsoft HoloLens 技术解谜(下)
读者提问之“HoloLens 的深度传感器有没有可能是基于 TOF?” 先介绍下背景知识,市面上常见的有三种类型的深度传感器: 结构光,这个技术的代表产品是 Kinect 一代,它的传感器芯片用的是 ...
- 揭开Linux操作系统的Swap交换区之谜
揭开Linux操作系统的Swap交换区之谜 Swap,即交换区,除了安装Linux的时候,有多少人关心过它呢?其实,Swap的调整对Linux服务器,特别是Web服务器的性能至关重要.通过调整Swap ...
- 解开Android应用程序组件Activity的"singleTask"之谜
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6714543 在Android应用程序中,可以配 ...
- Java常见问题3:周期之谜
谜24 byte是有符号的.范围是-128 - 127. 而0x90是int类型. 比較的时候.不相等. 假设想让其相等,须要进行类型转换:(byte & 0xff) 或者 (byte)0x9 ...
- 走进javascript——解开switch之谜
很早以前就觉得switch很怪异,或者说一直没太理解它,它怪异就怪异在非要给每个语句加上break;不然后面的语句就算不符合条件还是会执行,比如以下这段代码 var num = 2; switch(n ...
随机推荐
- Kubernetes学习续之一键部署kubeadm
1.Kubernetes的架构和组件,在部署时,它的每一个组件都是一个需要被执行的.单独的二进制文件,所以不难想象,SaltStack这样的运维工具或由社区维护的脚本的功能,就是要把这些二进制文件传输 ...
- 整理:C#中Expression表达式的妙用
原文:整理:C#中Expression表达式的妙用 一.目的:通过示例了解C#中Expression表达式的作用,通过表达式和反射可以写出很优雅的代码和架构,也可以完成一些看似不可能完成的任务 二.示 ...
- using 语句(C# 参考)(转载)
using 语句 提供可确保正确使用 IDisposable对象的方便语法. 示例 下面的示例演示如何使用 using 语句. using (var font1 = new Font("Ar ...
- 对ssm框架里面的一些常用注解的理解
@Componcnt :作用就是把当前类对象存入spring容器中 属性:value 用于指定bean的id 当我们不写的时候默认就是当前类名,并且首字母要小写 ------------------- ...
- C:\Program不是内部或外部命令,也不是可运行的程序或批处理文件。
问题描述:C:\Program不是内部或外部命令,也不是可运行的程序或批处理文件. 解决办法:C:\"Program Files"\具体文件目录. 具体场景:在cmd或者批处理文件 ...
- 设计模式之(六)原型模式(ProtoType)
认识原型模式 原型模式是比较简单的设计模式.废话不多说,直接看定义:用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象.通过实例指定种类,种类就是初始化的类,然后通过拷贝创建对象.先展示一个 ...
- 请实现一个js脚本,要求做到将数字转化为千分位表示如:1234567转化为1,234,567
//法一 function parseNum(num){ var list = new String(num).split('').reverse(); for(var i = 0; i < l ...
- 05-Vue组件
定义Vue组件 什么是组件: 组件的出现,就是为了拆分Vue实例的代码量的,能够让我们以不同的组件,来划分不同的功能模块,将来我们需要什么样的功能,就可以去调用对应的组件即可: 组件化和模块化的不同: ...
- 针对源代码和检查元素不一致的网页爬虫——利用Selenium、PhantomJS、bs4爬取12306的列车途径站信息
整个程序的核心难点在于上次豆瓣爬虫针对的是静态网页,源代码和检查元素内容相同:而在12306的查找搜索过程中,其网页发生变化(出现了查找到的数据),这个过程是动态的,使得我们在审查元素中能一一对应看到 ...
- JAVA分页工具类
最近写了一个代码生成工具,分享下该工具下的分页工具 一.分页工具类 package com.qy.code.api.page; import java.io.Serializable; import ...