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

传送门

用bitset优化,要不然n^3肯定超时

消元过程中有几点需要注意,找到最大元后break,保证题目中所说的K最小

如果有自由元说明解很多,直接返回

#include <bitset>
#include <cstdio>
#define N 2050
#define max(x, y) ((x) > (y) ? (x) : (y))

int n, m, ans;
std::bitset <N> s[N];
char S[N][N];

inline int read()
{
	int x = 0, f = 1;
	char ch = getchar();
	for(; !isdigit(ch); ch = getchar()) if(ch == ‘-‘) f = -1;
	for(; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + ch - ‘0‘;
	return x * f;
}

inline bool Gauss()
{
	int i, j, k;
	for(j = 1; j <= n; j++)
	{
		k = j;
		for(i = j; i <= m; i++)
			if(s[i][j])
			{
				k = i;
				ans = max(ans, i);
				break;
			}
		if(!s[k][j]) return 0;
		if(k != j) swap(s[k], s[j]);
		for(i = j + 1; i <= m; i++)
			if(s[i][j])
				s[i] ^= s[j];
	}
	for(i = n; i >= 1; i--)
		for(j = i + 1; j <= n; j++)
			s[i][n + 1] = s[i][n + 1] ^ (s[i][j] * s[j][n + 1]);
}

int main()
{
	int i, j, x;
	n = read();
	m = read();
	for(i = 1; i <= m; i++)
	{
		scanf("%s", S[i] + 1);
		for(j = 1; j <= n; j++)
			s[i][j] = S[i][j] - ‘0‘;
		s[i][n + 1] = read();
	}
	if(Gauss())
	{
		printf("%d\n", ans);
		for(i = 1; i <= n; i++)
			if(s[i][n + 1]) puts("?y7M#");
			else puts("Earth");
	}
	else puts("Cannot Determine");
	return 0;
}

  

时间: 2024-12-29 11:53:41

[luoguP2447] [SDOI2010]外星千足虫(高斯消元 + bitset)的相关文章

BZOJ.1923.[SDOI2010]外星千足虫(高斯消元 异或方程组 bitset)

题目链接 m个方程,n个未知量,求解异或方程组. 复杂度比较高,需要借助bitset压位. 感觉自己以前写的(异或)高斯消元是假的..而且黄学长的写法都不需要回代. //1100kb 324ms #include <cstdio> #include <cctype> #include <bitset> #include <algorithm> const int N=1004,M=2004; int n,m; char s[N]; std::bitset&l

bzoj 1923 [Sdoi2010]外星千足虫 高斯消元

题面 题目传送门 解法 学习了怎么用高斯消元解一个异或方程组 其实和普通的高斯消元是一样的 在多少个方程后就确定答案可以直接边做边取max即可 用bitset优化异或 时间复杂度:\(O(\frac{nm^2}{w})\) 代码 #include <bits/stdc++.h> using namespace std; template <typename node> void chkmax(node &x, node y) {x = max(x, y);} templat

【BZOJ-1923】外星千足虫 高斯消元 + xor方程组

1923: [Sdoi2010]外星千足虫 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 766  Solved: 485[Submit][Status][Discuss] Description Input 第一行是两个正整数 N, M. 接下来 M行,按顺序给出 Charles 这M次使用“点足机”的统计结果.每行包含一个“01”串和一个数字,用一个空格隔开.“01”串按位依次表示每只虫子是否被放入机器:如果第 i 个字符是“0”则代表编号为

[bzoj1923]外星千足虫[高斯消元]

高斯消元解异或方程组 1 #include <iostream> 2 #include <algorithm> 3 #include <cstdio> 4 #include <cstdlib> 5 #include <cstring> 6 #include <cmath> 7 #include <ctime> 8 #include <bitset> 9 10 using namespace std; 11 12

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

1923: [Sdoi2010]外星千足虫 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 634  Solved: 397[Submit][Status][Discuss] Description Input 第一行是两个正整数 N, M. 接下来 M行,按顺序给出 Charles 这M次使用“点足机”的统计结果.每行 包含一个“01”串和一个数字,用一个空格隔开.“01”串按位依次表示每只虫 子是否被放入机器:如果第 i 个字符是“0”则代表编号

1923: [Sdoi2010]外星千足虫

1923: [Sdoi2010]外星千足虫 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1312  Solved: 841[Submit][Status][Discuss] Description Input 第一行是两个正整数 N, M. 接下来 M行,按顺序给出 Charles 这M次使用“点足机”的统计结果.每行 包含一个“01”串和一个数字,用一个空格隔开.“01”串按位依次表示每只虫 子是否被放入机器:如果第 i 个字符是“0”则代表编

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

Description Input 第一行是两个正整数 N, M. 接下来 M行,按顺序给出 Charles 这M次使用"点足机"的统计结果.每行 包含一个"01"串和一个数字,用一个空格隔开."01"串按位依次表示每只虫 子是否被放入机器:如果第 i 个字符是"0"则代表编号为 i 的虫子未被放入,"1" 则代表已被放入.后面跟的数字是统计的昆虫足数 mod 2 的结果. 由于 NASA的实验机器精确无误

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

题目 输入格式 第一行是两个正整数 N, M. 接下来 M行,按顺序给出 Charles 这M次使用"点足机"的统计结果.每行 包含一个"01"串和一个数字,用一个空格隔开."01"串按位依次表示每只虫 子是否被放入机器:如果第 i 个字符是"0"则代表编号为 i 的虫子未被放入,"1" 则代表已被放入.后面跟的数字是统计的昆虫足数 mod 2 的结果. 由于 NASA的实验机器精确无误,保证前后数据不会自

1923. [SDOI2010]外星千足虫【高斯消元】

Description Input 第一行是两个正整数 N, M. 接下来 M行,按顺序给出 Charles 这M次使用“点足机”的统计结果.每行 包含一个“01”串和一个数字,用一个空格隔开.“01”串按位依次表示每只虫 子是否被放入机器:如果第 i 个字符是“0”则代表编号为 i 的虫子未被放入,“1” 则代表已被放入.后面跟的数字是统计的昆虫足数 mod 2 的结果. 由于 NASA的实验机器精确无误,保证前后数据不会自相矛盾.即给定数据 一定有解. Output 在给定数据存在唯一解时有