【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 ...
随机推荐
- 第四周(1):数据分布-Python实战
数据准备 数据集地址:http://jse.amstat.org/datasets/normtemp.dat.txt 数据集描述:总共只有三列:体温.性别.心率 数据集详细描述:Journal of ...
- "startIWDP": true
{ "platformName": "iOS", "platformVersion": "11.0", "au ...
- 连接池未注册org.logicalcobwebs.proxool.ProxoolException: Attempt to refer to a unregistered pool by its alias 'XXX'
代码之前一直好好的,写了一个定时器后报错,本地测试为了立马能执行就用cron表达式* * * * * ?,为了只执行一次在最后面加上Thread.sleep(1000*3600*24)睡眠二十四小时从 ...
- pandas-18 reindex用法
pandas-18 reindex用法 pandas中的reindex方法可以为series和dataframe添加或者删除索引. 方法:serise.reindex().dataframe.rein ...
- EXCHANGE上冒充任意用户--Exchange Server权限提升漏洞(CVE-2018-8581)分析
0x00 前言 这是我们2018年Top 5趣案系列中的第三个案例.这些漏洞都有一些因素使它们从今年发布的大约1,400个报告中脱颖而出.今天我们将分析一个Exchange漏洞,它允许任何经过身份验证 ...
- python之路第四天
2018年7月17日 python开发IDE: pycharm.eclipse # 专业版 # 不要汉化 安装:去官网下载pycharm 注册:https://blog.csdn. ...
- Flask+SQLAlchemy+graphene+docker示例
搭建一个利用docker启动服务的Flask的小demo 定义数据库 # -*- coding: utf-8 -*- from sqlalchemy import * from sqlalchemy. ...
- Httpd服务入门知识-Httpd服务常见配置案例之配置持久连接
Httpd服务入门知识-Httpd服务常见配置案例之配置持久连接 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.查看默认的持久连接时间 [root@node101.yinzhe ...
- linux 管道,输出重定向,后端执行
1. | (管道) $time|data:"Y-m-d"将前部的输出,作为后部的输入:配合管道使用的命令,典型的就是grep,more find --help | grep cne ...
- httprunner学习5-参数化与数据驱动
前言 参数化是自动化测试离不开的话题,httprunner里面只要把上一篇声明变量学会了,参数化也就自然会了. 不同的地方在于声明变量时对应值只有一个,参数化是多个值,存放在list里面. httpr ...