[SDOI2010]外星千足虫 题解 高斯消元+bitset简介
高斯消元 + bitset 简介:
高斯消元其实就是以加减消元为核心求唯一解。这道题还是比较裸的,可以快速判断出来。我们将每一只虫子看作一个未知数,这样根据它给出的 m 组方程我们可以高斯消元得出每一只虫子的归属地。如果你还不清楚高斯消元的原理可以移步此处
如果你只是以为这是一道板子题自信提交,那么恭喜你,你将会获得TLE的好成绩。为什么呢?我们知道高斯消元是 $ n^3 $ 复杂度的,而本题数据范围 $ n \leq 1000 $ ,$ m \leq 2000 $ ,明显会卡出TLE。
于是乎,bitset登场了,先介绍一下:
bitset是一种专门用来储存二进制的数组,使用前要先调用函数库。
他的每一个元素只占 1 bit空间,你可以将它当作bool类型的高精度。
他的优点很多,你可将他整体使用,也可单个访问,例如:
bitset<4> a (string("1001"));
bitset<4> b (string("0011"));
//注:bitset后面那对尖括号里的数表示a数组的大小
a+=b;
//此时a数组为1100
a[3]=1;
a[1]=0;
//此时a数组为1001
你不访问它单个的值是,bitset的运算就像一个普通的整数一样,可以进行与(&)、或(|)、异或(^)、左移(<<)、右移(>>)等操作。同时你还可以对这个数里的任意一位赋值修改。
这样我们就可以将高斯消元降为二维,将每一个方程用一个bitset维护,在用异或运算进行消元即可。
代码如下:
#include<iostream>
#include<cstdio>
#include<iomanip>
#include<algorithm>
#include<bitset>//调用bitset函数库
#define ll long long
#define db double
#define inf 0x7fffffff
using namespace std;
bitset<1005> s[2001];
int n,m,ans,now=1;
inline int qr(){//快读
char ch;
while((ch=getchar())<'0'||ch>'9');
int res=ch^48;
while((ch=getchar())>='0'&&ch<='9')
res=(res<<1)+(res<<3)+(ch^48);
return res;
}
inline int rd(){
char ch;
while((ch=getchar())<'0'||ch>'9');
return ch^48;//每次只读一个
}
int main(){
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
n=qr()+1,m=qr();
for(int i=1;i<=m;++i)//读入
for(int j=1;j<=n;++j)
s[i][j]=rd();
for(int i=1;i<n;now=++i){
while(!s[now][i]&&now<=m)++now;
ans=max(ans,now);//更新 k 值
if(now==m+1){
printf("Cannot Determine\n");
return 0;
} //方程不构成唯一解
if(now!=i)swap(s[i],s[now]);
for(int j=1;j<=m;j++){
if(i==j)continue; //不消自己
if(!s[j][i])continue;//不是1就不用消
s[j]^=s[i];//用异或消去系数 1
}//消去其他方程的系数
}
printf("%d\n",ans);
for(int i=1;i<n;++i)
if(s[i][n])printf("?y7M#\n");
else printf("Earth\n");
return 0;
}
bitset除了可以整体运算外还有很多功能:
foo.size() 返回大小(位数)
foo.count() 返回1的个数
foo.any() 返回是否有1
foo.none() 返回是否没有1
foo.set() 全都变成1
foo.set(p) 将第p + 1位变成1
foo.set(p, x) 将第p + 1位变成x
foo.reset() 全都变成0
foo.reset(p) 将第p + 1位变成0
foo.flip() 全都取反
foo.flip(p) 将第p + 1位取反
foo.to_ulong() 返回它转换为unsigned long的结果,如果超出范围则报错
foo.to_ullong() 返回它转换为unsigned long long的结果,如果超出范围则报错
foo.to_string() 返回它转换为string的结果
[SDOI2010]外星千足虫 题解 高斯消元+bitset简介的更多相关文章
- BZOJ_1923_[Sdoi2010]外星千足虫_高斯消元+bitset
BZOJ_1923_[Sdoi2010]外星千足虫_高斯消元 Description Input 第一行是两个正整数 N, M. 接下来 M行,按顺序给出 Charles 这M次使用“点足机”的统计结 ...
- bzoj 1923 [Sdoi2010]外星千足虫(高斯消元+bitset)
1923: [Sdoi2010]外星千足虫 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 634 Solved: 397[Submit][Status ...
- [luoguP2447] [SDOI2010]外星千足虫(高斯消元 + bitset)
传送门 用bitset优化,要不然n^3肯定超时 消元过程中有几点需要注意,找到最大元后break,保证题目中所说的K最小 如果有自由元说明解很多,直接返回 #include <bitset&g ...
- BZOJ1923 [Sdoi2010]外星千足虫 【高斯消元】
题目 输入格式 第一行是两个正整数 N, M. 接下来 M行,按顺序给出 Charles 这M次使用"点足机"的统计结果.每行 包含一个"01"串和一个数字,用 ...
- bzoj1923[Sdoi2010]外星千足虫(高斯消元)
Description Input 第一行是两个正整数 N, M. 接下来 M行,按顺序给出 Charles 这M次使用“点足机”的统计结果.每行 包含一个“01”串和一个数字,用一个空格隔开.“01 ...
- 【BZOJ】1923 [Sdoi2010]外星千足虫(高斯消元)
题目 传送门:QWQ 分析 高斯消元解异或方程组,和解普通方程组差不多. 范围有点大,要套一个bitset. 代码 #include <bits/stdc++.h> using names ...
- bzoj 1923: [Sdoi2010]外星千足虫【高斯消元】
裸的异或高斯消元 #include<iostream> #include<cstdio> using namespace std; const int N=2005; int ...
- [SDOI2010]外星千足虫(高斯消元)
高斯消元裸题... 方法一:暴力,O(2^n)20分 方法二:直接Gauss,加点玄学技巧搞得好的话70分 方法三:使用bitset优化,复杂度:$O(\frac{n^3}{ω})$ 不会的同学看一下 ...
- 【BZOJ 1923】1923: [Sdoi2010]外星千足虫 (高斯消元异或 | BITSET用法)
1923: [Sdoi2010]外星千足虫 Description Input 第一行是两个正整数 N, M. 接下来 M行,按顺序给出 Charles 这M次使用“点足机”的统计结果.每行 包含一个 ...
随机推荐
- 关于对i++,++i的理解
i++,代表 先赋值,在加:++i,代表先自加再赋值:后台console例子中可以看到第一个例子:var a= i++; i是等于1的:先赋值,所以打印出a =1的:而i++后为2:所以打印出a = ...
- 【刷题】BZOJ 3994 [SDOI2015]约数个数和
Description 设d(x)为x的约数个数,给定N.M,求 Input 输入文件包含多组测试数据. 第一行,一个整数T,表示测试数据的组数. 接下来的T行,每行两个整数N.M. Output T ...
- shell条件判断
1.字符串判断 str1 = str2 当两个串有相同内容.长度时为真 str1 != str2 当串str1和str2不等时为真 -n str1 当串的长度大于0时为真(串非空) -z str1 当 ...
- Android Emoji兼容包使用详解
Emoji兼容性 我们经常会遇到这样的问题: 给朋友发的emoji表情, 在自己手机上展示是正常的, 但是到朋友手机上, 却没有展示出来, 或者展示出来了, 但是也跟自己手机上展示的不一样. 所以, ...
- Raven: 2靶机入侵
0x00 前言 Raven 2是一个中等难度的boot2root 虚拟靶机.有四个flag需要找出.在多次被攻破后,Raven Security采取了额外措施来增强他们的网络服务器安全以防止黑客入侵. ...
- debian7编译安装tengine添加lua和ldap模块
1.安装开发环境 # aptitute update # aptitude install -y build-essential # aptitude install -y libldap2-dev ...
- 【堆的启发式合并】【P5290】[十二省联考2019]春节十二响
Description 给定一棵 \(n\) 个节点的树,点有点权,将树的节点划分成多个集合,满足集合的并集是树的点集,最小化每个集合最大点权之和. Limitation \(1~\leq~n~\le ...
- md5sum命令行使用注意事项
Linux下md5sum命令可以直接计算标准输入的hash值,使用方式为 echo -n '123456' | md5sum 注意给echo加上-n表示在尾部不加换行 命令行示例 $ echo -n ...
- CH3101 阶乘分解
题目链接 分解\(n!\)的质因数,输出相应的\(p_i\)和\(c_i\). 其中\(1\leq n\leq 10^6\). 考虑每一个质因子 \(p\) 在 \(n!\) 中出现的次数.显然, ...
- supervisor "INFO spawnerr: unknown error making dispatchers for xxx" 错误
查看 supervisor 的配置中,是否有受限的文件路径,如果有,则需要修改对应文件的权限