高斯消元 + 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简介的更多相关文章

  1. BZOJ_1923_[Sdoi2010]外星千足虫_高斯消元+bitset

    BZOJ_1923_[Sdoi2010]外星千足虫_高斯消元 Description Input 第一行是两个正整数 N, M. 接下来 M行,按顺序给出 Charles 这M次使用“点足机”的统计结 ...

  2. bzoj 1923 [Sdoi2010]外星千足虫(高斯消元+bitset)

    1923: [Sdoi2010]外星千足虫 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 634  Solved: 397[Submit][Status ...

  3. [luoguP2447] [SDOI2010]外星千足虫(高斯消元 + bitset)

    传送门 用bitset优化,要不然n^3肯定超时 消元过程中有几点需要注意,找到最大元后break,保证题目中所说的K最小 如果有自由元说明解很多,直接返回 #include <bitset&g ...

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

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

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

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

  6. 【BZOJ】1923 [Sdoi2010]外星千足虫(高斯消元)

    题目 传送门:QWQ 分析 高斯消元解异或方程组,和解普通方程组差不多. 范围有点大,要套一个bitset. 代码 #include <bits/stdc++.h> using names ...

  7. bzoj 1923: [Sdoi2010]外星千足虫【高斯消元】

    裸的异或高斯消元 #include<iostream> #include<cstdio> using namespace std; const int N=2005; int ...

  8. [SDOI2010]外星千足虫(高斯消元)

    高斯消元裸题... 方法一:暴力,O(2^n)20分 方法二:直接Gauss,加点玄学技巧搞得好的话70分 方法三:使用bitset优化,复杂度:$O(\frac{n^3}{ω})$ 不会的同学看一下 ...

  9. 【BZOJ 1923】1923: [Sdoi2010]外星千足虫 (高斯消元异或 | BITSET用法)

    1923: [Sdoi2010]外星千足虫 Description Input 第一行是两个正整数 N, M. 接下来 M行,按顺序给出 Charles 这M次使用“点足机”的统计结果.每行 包含一个 ...

随机推荐

  1. 微信小程序 功能函数 定时震动

    ffn: function () { let nnn = this.data.nnn nnn += 1; this.setData({ nnn: nnn }); if (nnn > 10) { ...

  2. ACM数论之旅14---抽屉原理,鸽巢原理,球盒原理(叫法不一又有什么关系呢╮(╯▽╰)╭)

    这章没有什么算法可言,单纯的你懂了原理后会不会运用(反正我基本没怎么用过 ̄ 3 ̄) 有366人,那么至少有两人同一天出生(好孩子就不要在意闰年啦( ̄▽ ̄")) 有13人,那么至少有两人同一月 ...

  3. 高性能页面加载技术--BigPipe设计原理及Java简单实现

    1.技术背景 动态web网站的历史可以追溯到万维网初期,相比于静态网站,动态网站提供了强大的可交互功能.经过几十年的发展,动态网站在互动性和页面显示效果上有了很大的提升,但是对于网站动态网站的整体页面 ...

  4. sys下gpio操作

    gpio_operation 通过/sys/文件接口操作IO端口 GPIO到文件系统的映射 * 控制GPIO的目录位于/sys/class/gpio * /sys/class/gpio/export文 ...

  5. Java并发编程中的设计模式解析(二)一个单例的七种写法

    Java单例模式是最常见的设计模式之一,广泛应用于各种框架.中间件和应用开发中.单例模式实现起来比较简单,基本是每个Java工程师都能信手拈来的,本文将结合多线程.类的加载等知识,系统地介绍一下单例模 ...

  6. 【移动端debug-5】可恶的1px万能实现方案

    最近和设计同学调ui,遇到的是一位对1px有极致追求的同学,像素眼一眼看出我写的是不是1px,所以让我好好地研究了一番1px到底怎么写最方便. 一.为什么出不来1px? 简而言之:css的1px只是一 ...

  7. UVA11324_The Largest Clique

    极大团.即求一个最大点集,使得点集中的任意两个点u,v至少存在u->v,或者v->u的路径. 是这样做的,求出所有的联通分量,然后整个图就变成了无环图,把原来若干个点缩点,点权为分量的点数 ...

  8. ORA-01034和ORA-27101的解决方法

    问题所在: 1.要登录的数据库实例内容配置内容错误,联系负责该机子的管理员看原因

  9. SDOI2017遗忘的集合

    题面链接 咕咕咕 题外话 为了这道题我敲了\(MTT\).多项式求逆.多项式\(ln\)等模板,搞了将近一天. sol 最近懒得写题解啊,随便搞搞吧. 看到这个就是生成函数套上去. \[F(x)=\p ...

  10. 解题:POI 2008 Subdivision of Kingdom

    题面 还可以这么搜......学到了(PoPoQQQ orz) 我们最朴素的做法是枚举所有状态(当然可以剪,剪完最终实际状态量也是$C_{26}^{13}$的),然后每次$O(n)$扫一遍判断,大概会 ...