【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 ...
随机推荐
- Linux学习笔记之CentOS 7系统使用firewalld管理防火墙端口
0x00 firewalld的基本使用 # 启动: systemctl start firewalld # 查看状态: systemctl status firewalld # 停止: systemc ...
- C# 练习题 利用条件运算符的嵌套来完成分数等级划分
题目:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示.1.程序分析:(a>b)?a:b这是条件运算符的基本例子. cla ...
- 利用cv与matplotlib.pyplot读图片与显示图片
import matplotlib.pyplot as pltimport cv2 as cva=cv.imread('learn.jpg')cv.imshow('learn',a)fig=plt.f ...
- 2019 百合佳缘java面试笔试题 (含面试题解析)
本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.百合佳缘等公司offer,岗位是Java后端开发,因为发展原因最终选择去了百合佳缘,入职一年时间了,也成为了面 ...
- 16. Promise对象
目录 Promise对象 一.含义 1. Promise是什么 2. 实例讨论 二.Promise特性案例解析 1. Promise的立即执行性 2. promise的三种状态 3. Promise的 ...
- react 爬坑记录
1.父子组件优化其一发生render条件:数据改变(state或者props改变),有时子组件会过多render.这时可在子组件里面的生命周期钩子里执行 shouldComponentUpdate(n ...
- 使用代码获得Hybris Commerce里显示的产品图片
使用下面这个API去取Hybris Commerce系统里产品主数据的明细信息: https://:9002/rest/v2/electronics/products/300938?fields=FU ...
- 【异常】ERROR in ch.qos.logback.core.joran.spi.Interpreter@159:22 - no applicable action for [charset], current ElementPath is [[configuration][appender][encoder][charset]]
一.异常信息 Exception in thread "restartedMain" java.lang.reflect.InvocationTargetException at ...
- Python 关于列表字典的键值修改
list (修改列表的索引值) 循环一个列表时,最好不要对原列表有改变大小的操作,这样会影响你的最终结果. #使用负索引进行修改列表 print('First') lis = [11, 22, 33, ...
- PAT 乙级 1022.D进制的A+B C++/Java
1022 D进制的A+B (20 分) 题目来源 输入两个非负 10 进制整数 A 和 B (≤),输出 A+B 的 D (1)进制数. 输入格式: 输入在一行中依次给出 3 个整数 A.B 和 D. ...