【高斯消元解xor方程】BZOJ1923-[Sdoi2010]外星千足虫
【题目大意】
有n个数或为奇数或为偶数,现在进行m次操作,每次取出部分求和,告诉你这几次操作选取的数和它们和的奇偶性。如果通过这m次操作能得到所有数的奇偶性,则输出进行到第n次时即可求出答案;否则输出无法确定。
【思路】
高斯消元解xor方程组,求最少需要的方程个数或判断无法确定。
无法确定即存在自由元,在每次操作中找1的时候判断一下就好了;最小方程个数,就是记录下每次找到的最小的1的位置,最后输出最大值即可。
【错误】
忘记把ans改为-1了(见程序注释)
【备注】
P.S.我看别人在高斯消元的过程中都是当前行和所有行xor一遍,而不是从下一行开始;然后结果就不需要回代了只需直接输出第n+1列即可??不适合呢明白????
在莫涛和proverbs那里找到答案了:
考虑系数矩阵,每行是一个方程,每列是一个未知数在各个方程中的系数(将第i行的方程的所有系数状压到一个数 a[i]里,可以用bitset)。
我们分析一下消元之后各个方程系数的状况:
由于我们每次选择最大的一个 a[i],并且找到它最高位上的1,把其它所有方程(包含当前行以上的方程)这一位的系数全部消去,也就是说对于每个方程,它的系数 a[i]最高位上的1所在的那一列,仅有这一个1,其余的都是0。再进一步,如果方程个数n足够多的话,那么消元之后系数矩阵的每一行仅有一个1,并且这个1所在的那一列也仅有这一个1。
/*回代的做法*/
/**************************************************************
Problem: 1923
Language: C++
Result: Accepted
Time:244 ms
Memory:1556 kb
****************************************************************/ #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<bitset>
using namespace std;
const int MAXN=+;
const int MAXM=+;
bitset<MAXN> map[MAXM];
int n,m;
int times=-; void Gauss()
{
for (int i=;i<=n;i++)
{
int t=i;
for (;t<=m && !map[t][i];t++);
if (t>m)
{
times=-;//这里times要清成-1
return;
}
if (t!=i) swap(map[i],map[t]);
times=max(times,t);
for (int j=i+;j<=m;j++)
if (map[j][i])
map[j]^=map[i];
} } void init()
{
scanf("%d%d",&n,&m);
for (int i=;i<m;i++)
{
char str[MAXN];
int mapans;
scanf("%s%d",str,&mapans);
map[i+][n+]=mapans;
for (int j=;j<n;j++) map[i+][j+]=str[j]-'';
}
} void print_ans()
{
if (times==-) cout<<"Cannot Determine"<<endl;
else
{
printf("%d\n",times);
for (int i=n;i>=;i--)
for (int k=i+;k<=n;k++)
if (map[i][k])
{
int tmp=map[i][n+]^map[k][n+];
map[i][n+]=tmp;
}
for (int i=;i<=n;i++)
puts((map[i][n+])?"?y7M#":"Earth");
}
} int main()
{
init();
Gauss();
print_ans();
}
额变慢了……仿佛被欺骗了感情……谁来告诉我一下??!!
/*不回代的做法*/
/**************************************************************
Problem: 1923
Language: C++
Result: Accepted
Time:284 ms
Memory:1556 kb
****************************************************************/ #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<bitset>
using namespace std;
const int MAXN=+;
const int MAXM=+;
bitset<MAXN> map[MAXM];
int n,m;
int times=-; void Gauss()
{
for (int i=;i<=n;i++)
{
int t=i;
for (;t<=m && !map[t][i];t++);
if (t>m)
{
times=-;//这里times要清成-1
return;
}
if (t!=i) swap(map[i],map[t]);
times=max(times,t);
for (int j=;j<=m;j++)
if (i!=j && map[j][i])
map[j]^=map[i];
} } void init()
{
scanf("%d%d",&n,&m);
for (int i=;i<m;i++)
{
char str[MAXN];
int mapans;
scanf("%s%d",str,&mapans);
map[i+][n+]=mapans;
for (int j=;j<n;j++) map[i+][j+]=str[j]-'';
}
} void print_ans()
{
if (times==-) cout<<"Cannot Determine"<<endl;
else
{
printf("%d\n",times);
for (int i=;i<=n;i++)
puts((map[i][n+])?"?y7M#":"Earth");
}
} int main()
{
init();
Gauss();
print_ans();
}
【高斯消元解xor方程】BZOJ1923-[Sdoi2010]外星千足虫的更多相关文章
- 【高斯消元】【异或方程组】【bitset】bzoj1923 [Sdoi2010]外星千足虫
Xor方程组解的个数判定: ——莫涛<高斯消元解Xor方程组> 使用方程个数判定:消去第i个未知数时,都会记录距第i个方程最近的第i位系数不为0の方程是谁,这个的max就是使用方程个数. ...
- 【高斯消元解xor方程组】BZOJ2466-[中山市选2009]树
[题目大意] 给出一棵树,初始状态均为0,每反转一个节点的状态,相邻的节点(父亲或儿子)也会反转,问要使状态均为1,至少操作几次? [思路] 一场大暴雨即将来临,白昼恍如黑夜!happy! 和POJ1 ...
- BZOJ1923: [Sdoi2010]外星千足虫
传送门 高斯消元求解Xor方程. 这个方程很容易换成xor的方程.然后用高斯消元搞就行了. 用bitset实现这个非常方便. //BZOJ 1923 //by Cydiater //2016.11.3 ...
- BZOJ1923:[SDOI2010]外星千足虫(高斯消元)
Description Input 第一行是两个正整数 N, M. 接下来 M行,按顺序给出 Charles 这M次使用“点足机”的统计结果.每行 包含一个“01”串和一个数字,用一个空格隔开.“01 ...
- bzoj千题计划188:bzoj1923: [Sdoi2010]外星千足虫 (高斯—若尔当消元法解异或方程组)
http://www.lydsy.com/JudgeOnline/problem.php?id=1923 #include<cstdio> #include<cstring> ...
- 【题解】 bzoj1923: [Sdoi2010]外星千足虫 (线性基/高斯消元)
bzoj1923,戳我戳我 Solution: 这个高斯消元/线性基很好看出来,主要是判断在第K 次统计结束后就可以确定唯一解的地方和\(bitset\)的骚操作 (我用的线性基)判断位置,我们可以每 ...
- bzoj1923[Sdoi2010]外星千足虫(高斯消元)
Description Input 第一行是两个正整数 N, M. 接下来 M行,按顺序给出 Charles 这M次使用“点足机”的统计结果.每行 包含一个“01”串和一个数字,用一个空格隔开.“01 ...
- POJ 1222 EXTENDED LIGHTS OUT(高斯消元解XOR方程组)
http://poj.org/problem?id=1222 题意:现在有5*6的开关,1表示亮,0表示灭,按下一个开关后,它上下左右的灯泡会改变亮灭状态,要怎么按使得灯泡全部处于灭状态,输出方案,1 ...
- BZOJ1923 [Sdoi2010]外星千足虫 【高斯消元】
题目 输入格式 第一行是两个正整数 N, M. 接下来 M行,按顺序给出 Charles 这M次使用"点足机"的统计结果.每行 包含一个"01"串和一个数字,用 ...
随机推荐
- bzoj 1014 splay
首先我们可以用splay来维护这个字符串,那么对于某两个位置的lcp,维护每个节点的子树的hash,然后二分判断就好了. /************************************** ...
- Gulp、Grunt构建工具
在Gulp中创建一个库从磁盘gulp.src读取源文件并通过磁盘管道写回内容到gulp.dest,可以理解成只是将文件复制到另一个目录. var gulp = require('gulp'); gul ...
- Apache的Commons Lang和BeanUtils
1.字符串的空判断 //isEmpty System.out.println(StringUtils.isEmpty(null)); // true System.out.println(S ...
- go语言爬虫goquery和grequests的使用
/*下载工具*/ package main import ( "fmt" //go语言版本的jquery "github.com/PuerkitoBio/goquery& ...
- c#使用selenium+Chromedriver参数配置
using System; //添加selenium的引用 using OpenQA.Selenium.PhantomJS; using OpenQA.Selenium.Chrome; using O ...
- Spring,tk-mapper源码阅读
Mybatis的源码学习(一): 前言: 结合spring本次学习会先从spring-mybatis开始分析 在学习mybatis之前,应该要对spring的bean有所了解,本文略过 先贴一下myb ...
- Linux 基础——开山篇
为什么要开始学习Linux命令? 首先当然是因为工作需要了,现在的工作是负责银行调度的系统的源系统接入的工作,经常要到生产部署版本.所以……买了一本<Linux命令行与shell脚本编程大全&g ...
- Bootstrap 实现CRUD示例及代码
https://github.com/wenzhixin/bootstrap-table-examples/blob/master/crud/index.html <!DOCTYPE html& ...
- 17-7-24-react入门
先说明下为什么说好每天一更,周五周六周日都没有更新.因为在周五的时候,上司主动找我谈了转正后的工资4-4.5K.本来想好是6K的,后来打听了一圈公司的小伙伴,都是5-5.5,我就把自己定到了5K.万万 ...
- B. Black Square(字符串)
B. Black Square time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...