【题目大意】

有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]外星千足虫的更多相关文章

  1. 【高斯消元】【异或方程组】【bitset】bzoj1923 [Sdoi2010]外星千足虫

    Xor方程组解的个数判定: ——莫涛<高斯消元解Xor方程组> 使用方程个数判定:消去第i个未知数时,都会记录距第i个方程最近的第i位系数不为0の方程是谁,这个的max就是使用方程个数. ...

  2. 【高斯消元解xor方程组】BZOJ2466-[中山市选2009]树

    [题目大意] 给出一棵树,初始状态均为0,每反转一个节点的状态,相邻的节点(父亲或儿子)也会反转,问要使状态均为1,至少操作几次? [思路] 一场大暴雨即将来临,白昼恍如黑夜!happy! 和POJ1 ...

  3. BZOJ1923: [Sdoi2010]外星千足虫

    传送门 高斯消元求解Xor方程. 这个方程很容易换成xor的方程.然后用高斯消元搞就行了. 用bitset实现这个非常方便. //BZOJ 1923 //by Cydiater //2016.11.3 ...

  4. BZOJ1923:[SDOI2010]外星千足虫(高斯消元)

    Description Input 第一行是两个正整数 N, M. 接下来 M行,按顺序给出 Charles 这M次使用“点足机”的统计结果.每行 包含一个“01”串和一个数字,用一个空格隔开.“01 ...

  5. bzoj千题计划188:bzoj1923: [Sdoi2010]外星千足虫 (高斯—若尔当消元法解异或方程组)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1923 #include<cstdio> #include<cstring> ...

  6. 【题解】 bzoj1923: [Sdoi2010]外星千足虫 (线性基/高斯消元)

    bzoj1923,戳我戳我 Solution: 这个高斯消元/线性基很好看出来,主要是判断在第K 次统计结束后就可以确定唯一解的地方和\(bitset\)的骚操作 (我用的线性基)判断位置,我们可以每 ...

  7. bzoj1923[Sdoi2010]外星千足虫(高斯消元)

    Description Input 第一行是两个正整数 N, M. 接下来 M行,按顺序给出 Charles 这M次使用“点足机”的统计结果.每行 包含一个“01”串和一个数字,用一个空格隔开.“01 ...

  8. POJ 1222 EXTENDED LIGHTS OUT(高斯消元解XOR方程组)

    http://poj.org/problem?id=1222 题意:现在有5*6的开关,1表示亮,0表示灭,按下一个开关后,它上下左右的灯泡会改变亮灭状态,要怎么按使得灯泡全部处于灭状态,输出方案,1 ...

  9. BZOJ1923 [Sdoi2010]外星千足虫 【高斯消元】

    题目 输入格式 第一行是两个正整数 N, M. 接下来 M行,按顺序给出 Charles 这M次使用"点足机"的统计结果.每行 包含一个"01"串和一个数字,用 ...

随机推荐

  1. DesignPattern

    目录

  2. spring cloud ribbon 断路器

    @EnableDiscoveryClient @SpringBootApplication @EnableCircuitBreaker //开启断路器 public class ConsumerMov ...

  3. php快速入门总结

    因为本人已经接触了C和C++两年多了,虽然真正用它们的机会很少,但是基本的语法还是相对熟悉的.半年前的课程设计用了PHP,所以当初我也只是现学先用, 学得很粗糙,现在,跟一个同学合作搞一个比赛的项目, ...

  4. ThinkPHP3.1.3 整合 UEditor百度编辑器 图片上传

    第一步.前端模板实例化百度编辑器 <js file='__ROOT__/Data/UEditor/ueditor.config.js' /> <js file='__ROOT__/D ...

  5. 安全测试===sqlmap(零)转载

    本文转自:https://blog.werner.wiki/sqlmap-study-notes-0/ 感谢作者的整理,如有侵权,立删 零.前言 这篇文章是我学习Sqlmap的用法时做的笔记,记录了S ...

  6. python基础===pendulum '''Python datetimes made easy.'''

    https://pypi.python.org/pypi/pendulum Pendulum的一大优势是内嵌式取代Python的datetime类,可以轻易地将它整合进已有代码,并且只在需要的时候才进 ...

  7. [c++,bson] linux 使用 BSON 编程[www]

    [c++,bson] linux 使用 BSON 编程 http://blog.chinaunix.net/uid-28595538-id-4987410.html 1.js db=db.getSib ...

  8. api文档工具

    平台选型         Apidoc         文档参考:http://apidocjs.com        优点      文档齐全,操作简单,ui清晰,代码注解查询性强,语言支持多元化, ...

  9. C中级 消息队列设计

    引言  - 补充好开始 消息队列在游戏服务器层应用非常广泛. 应用于各种耗时的IO操作业务上.消息队列可以简单理解为 [消息队列 = 队列 + 线程安全]本文参照思路如下, 最后献上一个大神们斗法的场 ...

  10. [How to]Cloudera manager 离线安装手册

    2016-01-1910:54:05  增加kafka 1.简介 本文介绍在离线环境下安装Cloudera manager和简单使用方法 2.环境 OS:CentOS 6.7 Cloudera man ...