高斯消元 + 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 0x7fffffffusing 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的结果

转载于:https://www.cnblogs.com/812-xiao-wen/p/9872897.html

[SDOI2010]外星千足虫 题解 高斯消元+bitset简介相关推荐

  1. 【BZOJ1923】外星千足虫,高斯消元解xor方程组

    Time:2016.08.29 Author:xiaoyimi 转载注明出处谢谢 传送门 思路: 原本以为是高斯消元解取模方程,后来发现这题意不就和异或方程一样吗 [异或(XOR)运算由于与" ...

  2. 线性代数五之高斯消元——[SDOI2010]外星千足虫,[HNOI2013]游走,[HNOI2011]XOR和路径,[hdu 4035]Maze

    多类型高斯消元杂题 [SDOI2010]外星千足虫 description solution code [HNOI2013]游走 description solution code [HNOI2011 ...

  3. P2447 [SDOI2010]外星千足虫

    P2447 [SDOI2010]外星千足虫 题意: 有n个未知数 给你一个m行n+1列的式子,对于每行,1到n列为这个n个未知数的系数,第n+1列为该行式子的和mod2,问n个未知数是否有唯一解,并输 ...

  4. BZOJ 1923: [Sdoi2010]外星千足虫

    1923: [Sdoi2010]外星千足虫 Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 921  Solved: 592 [Submit][Stat ...

  5. [Luogu P2447] [BZOJ 1923] [SDOI2010]外星千足虫

    洛谷传送门 BZOJ传送门 航空航天局(NASA)研制发射,行经火星.金星.土卫六.木卫二.谷神星."张衡星"等232323颗太阳系星球,并最终在小行星"杰森星" ...

  6. bzoj1923 [Sdoi2010]外星千足虫 压位+高斯消元

    这个题手动压位非常麻烦,因为对于同一块,后加的数比先加的数小,所以判断最后一位的时候需要定位到最后一块最小的数,而且在找元的时候还不能找到这个位置 注意块的总数每个是30个不要存错, 码: #incl ...

  7. 【bzoj3601】一个人的数论 莫比乌斯反演+莫比乌斯函数性质+高斯消元

    Description Sol 这题好难啊QAQ 反正不看题解我对自然数幂求和那里是一点思路都没有qwq 先推出一个可做一点的式子: \(f(n)=\sum_{k=1}^{n}[(n,k)=1]k^d ...

  8. BZOJ 1013: [JSOI2008]球形空间产生器sphere 高斯消元

    1013: [JSOI2008]球形空间产生器sphere Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/Judg ...

  9. 【BZOJ4820】[SDOI2017]硬币游戏(高斯消元)

    [BZOJ4820][SDOI2017]硬币游戏(高斯消元) 题面 BZOJ 洛谷 题解 第一眼的感觉就是构\(AC\)自动机之后直接高斯消元算概率,这样子似乎就是\(BZOJ1444\)了.然而点数 ...

最新文章

  1. CFileDialog的使用方法简单介绍
  2. 习题:统计字符串中的单词个数
  3. SAP CRM Fiori应用My Task的前台优化
  4. 元璟资本陈洪亮解析人货场融合 消费者变成“合作者”
  5. Python数据结构:二分查找
  6. matlab consumption,Lesage matlab 空间
  7. win11打开安全中心显示英文怎么办 windows11打开安全中心显示英文的解决方法
  8. Odoo 强大的开源微信模块 oejia_wx
  9. 泰拉瑞亚手机版html,泰拉瑞亚1.2
  10. 计算机笔记本硬盘,笔记本取证之--笔记本硬盘拆卸
  11. CDH6.3.2安装文档
  12. TortoiseSVN 汉化
  13. win10如何删除输入法_如何关闭微软拼音输入法?
  14. Tensorflow笔记4:Saver
  15. nodejs--process
  16. 某pdf转word v6.3.0.2算法分析
  17. android 部分手机Camera 拍照 图片被旋转90度的解决方法
  18. linux su -含义,linux su命令详解步骤
  19. 小白算法练习 lanqiao SPFA+vector 模板
  20. Linux中搜索大于200M的文件

热门文章

  1. 毕业后五年拉开差距的原因在哪里
  2. 基于STM32,无人船岸基信息处理代码--python实现
  3. JAVA去掉指定字符
  4. Flex学习的利器《Hello Flex4》
  5. 烧写文件系统——韦东山嵌入式Linux学习笔记11
  6. UNIX再学习 -- XSI IPC通信方式
  7. android开发 Gradle多渠道打包以及集成360加固
  8. linux+sysrq+键盘调试,内核调试 – MagicSysRq - 嵌入式 Linux 知识库
  9. Java isAlive()和join()的使用
  10. CVE-2017-8890漏洞分析与利用(Root Android 7.x)