• [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
    ", ans);
    		for(i = 1; i <= n; i++)
    			if(s[i][n + 1]) puts("?y7M#");
    			else puts("Earth");
    	}
    	else puts("Cannot Determine");
    	return 0;
    }
    

      

  • 相关阅读:
    【洛谷4941】War2 状压Dp
    洛谷4623 [COCI2012-2013#6] BUREK
    洛谷1099 [NOIP2007] 树网的核
    【Jim】I am back (ง •_•)ง
    发个ZKW线段树板子测试一下代码高亮
    洛谷2764 最小路径覆盖问题
    洛谷1972 [SDOI2009]HH的项链
    bzoj1059 [ZJOI2007]矩阵游戏
    知识点整理--组合数学
    最大矩形问题总结
  • 原文地址:https://www.cnblogs.com/zhenghaotian/p/7496441.html
Copyright © 2020-2023  润新知