【高斯消元解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"串和一个数字,用 ...
随机推荐
- Python的异常处理机制 -- (转)
当你的程序中出现异常情况时就需要异常处理.比如当你打开一个不存在的文件时.当你的程序中有一些无效的语句时,Python会提示你有错误存在. 下面是一个拼写错误的例子,print写成了Print.Pyt ...
- Android控件——TextView,EditText
TextView: 显示文本控件 EditText 输入文本框 1.TextView常用属性:
- docker使用小记
查看当前镜像:docker images 运行一个简单的镜像:docker run hello-world 拉取一个远程docker:docker pull centos docker中安装nginx ...
- AlertDialog.Builder 显示为白色 蓝色字
AlertDialog.Builder dialog = new AlertDialog.Builder( getActivity(),AlertDialog.THEME_HOLO_LIGHT);
- 网络知识===wireshark抓包数据分析(一)
wireshark分析: 上图是我进行一个HTTP协议的下载,文件内容大概是1.7M左右. 抓包数据: https://files.cnblogs.com/files/botoo/wireshark% ...
- MSCL超级工具类(C#),开发人员必备,开发利器
MSCL超强工具类库 是基于C#开发的超强工具类集合,涵盖了日常B/S或C/S开发的诸多方面,包含上百个常用封装类(数据库操作类全面支持Mysql.Access.Oracle.Sqlserver.Sq ...
- python的IDLE界面回退代码语句
Alt+P回退到IDLE中之前输入的代码语句 Alt+N可以移至下一个代码语句
- TCP三次握手和四次挥手及用户访问网页流程
TCP报文格式 TCP通信是通过报文进行的,首先要了解TCP报文的格式. 序号:Seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记. 确认序号:Ack序号,占 ...
- Myeclipse实用快捷键总结
alt+shift+J 为选中的类/方法添加注释 ctrl+T 显示选中类的继承树 ctrl+shift+X/Y 将选中的字符转换为大写/小写 ctrl+shift+R 打开资源 ctrl+shift ...
- EF框架的优点是什么?
在.Net Framework SP1微软包含一个实体框架(Entity Framework),此框架可以理解成微软的一个ORM产品.用于支持开发人员通过对概念性应用程序模型编程(而不是直接对关系存储 ...