【高斯消元解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"串和一个数字,用 ...
随机推荐
- poj 2387 Til the Cows Come Home(dijkstra算法)
题目链接:http://poj.org/problem?id=2387 题目大意:起点一定是1,终点给出,然后求出1到所给点的最短路径. 注意的是先输入边,在输入的顶点数,不要弄反哦~~~ #incl ...
- [bzoj1070] 修车
这周学习了费用流,就写了几题.其中有一题就是bzoj上的修车,看起来很丧,交了6次都是除了样例全wa(事实证明样例说明不了什么,还会误导你……). 题目大意:有m个技术人员n辆车,一个技术人员只能同时 ...
- 另类dedecms后台拿shell
遇到一个被阉割的后台,发现直接传shell显然不行. 然后就有了下文 添加一个新广告. 插入一句话木马: --><?php $_GET[c]($_POST[x]);?><!-- ...
- 【Python学习】程序运行完发送邮件提醒
有时候我们运行一个需要跑很长时间的程序,不管是在云主机还是本地主机上运行,我们都不可能一直守在电脑面前等.所以想到使用邮件来通知提醒. 示例代码如下 # -*- coding: utf-8 -*- # ...
- Coursera助学金申请模板
讲真,我觉得coursera的课还挺贵的.但是它有助学金系统,非常对我们穷学生友好了,而且基本上申请的都会批.不过现在助学金需要15个工作日才有答复,所以注意要提前申请. 有两大段要填. 虽然写的挺烂 ...
- Call Mode feature
起源 user 在插著 充電器 打電話的狀況下, 為了安全起見, 避免 充電器在這時損害手機,間接造成 user 的傷害, 而有了這 feature, 在 battery voltage Vbat & ...
- (八)hope
vi svnserve.conf vi passwdvi authz svnserve -d -r /usr/svnkillall svnserveps -ef | grep svnserve svn ...
- docker基于本地模版导入创建镜像
/* 因为直接去网站拿会下载的慢,所以直接到网站里,对着此包--〉右键--〉复制链接地址 网站地址:https://openvz.org/Download/template/precreated */ ...
- JS怎么刷新当前页面
JS怎么刷新当前页面 reload 方法,该方法强迫浏览器刷新当前页面.语法:location.reload([bForceGet]) 参数: bForceGet, 可选参数, 默认为 false,从 ...
- Python Flask 配置文件
1. 什么是配置文件? 就是当程序调用的一些参数,文件路径,方法或者类放到一个文件中, 当下次需要修改的一个参数的时候,不用再从所有关联的程序中找到该参数挨个修改, 比较繁琐.像Django中,程序启 ...