【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 ...
随机推荐
- js 时间格式化成字符串
我用的简单的直接的字符串格式转化 function getTimeStr() { var date = new Date(); var year = date.getFullYear(); var m ...
- 题解 POJ 2559【Largest Rectangle in a Histogram】(单调栈)
题目链接:http://poj.org/problem?id=2559 思路:单调栈 什么是单调栈? 单调栈,顾名思义,就是单调的栈,也就是占中存的东西永远是单调(也就是递增或递减)的 如何实现一个单 ...
- 网络编程之基于UDP协议的套接字编程、基于socketserver实现并发的socket
目录 基于UDP协议的套接字编程 UDP套接字简单示例 服务端 客户端 基于socketserver实现并发的socket 基于TCP协议 server类 request类 继承关系 服务端 客户端1 ...
- vue的v-bind详解
前言 v-bind 主要用于属性绑定,比方你的class属性,style属性,value属性,href属性等等,只要是属性,就可以用v-bind指令进行绑定.这篇文章主要介绍了VueJs中的V-bin ...
- 手表WACCHE单词WACCHE腕表
中文名:手表 外文名:watch,wacche 佩戴部位:手腕 拼音:shǒu biǎo 含义 1.戴在手腕上的小型计时器. 茅盾<夏夜一点钟>:“‘哼哼,这家伙!骗人的!’--她本能地校 ...
- CDA数据分析【第一章:数据分析概述】
一.数据分析行业发展 1.如何收集.保存.管理.分析.共享正在呈指数式增长的数据是我们必须要面对的一个重要挑战. 2.数据分析包括数据采集.数据存储.检查.清洗.分析.转换和建模等方法对数据进行处理的 ...
- “GIS DICTIONARY A-Z” 查询页面开发(3)—— 基础知识之服务器、IP地址、域名、DNS、端口以及Web程序的访问流程
今天补一补基础知识: 一.服务器:能够提供服务的机器,取决于机器上安装的软件(服务软件).服务器响应服务请求,并进行处理. Web服务器:提供Web服务,即网站访问.常见Web服务软件:Apache( ...
- 带你快速上手前端三剑客之css
CSS介绍 CSS(Cascading Style Sheet , 层叠样式表)定义如何显示HTML元素.当浏览器读到一个样式表,它就会按照这个样式表来对文档进行格式化(渲染) 组成 每个CS ...
- PAT 乙级 1011.A+B 和 C C++/Java
题目来源 给定区间 [−] 内的 3 个整数 A.B 和 C,请判断 A+B 是否大于 C. 输入格式: 输入第 1 行给出正整数 T (≤),是测试用例的个数.随后给出 T 组测试用例,每组占一行, ...
- BST二叉树的二分查找
900. 二叉搜索树中最接近的值 中文 English 给一棵非空二叉搜索树以及一个target值,找到在BST中最接近给定值的节点值 样例 样例1 输入: root = {5,4,9,2,#,8,1 ...