zoukankan      html  css  js  c++  java
  • [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;
    }
    

      

  • 相关阅读:
    Java基础00-模块36
    Java基础00-反射35
    Java基础00-Stream流34
    Java基础00-函数式接口33
    Java基础00-方法引用32
    运用龙格库塔法解大雷洛数平板绕流问题
    LB 学习日记
    Numba学习日记 —— 2019-12-5
    文件的操作及相关异常的处理
    time模块的两个函数time.clock()和time.time()的区别
  • 原文地址:https://www.cnblogs.com/zhenghaotian/p/7496441.html
Copyright © 2011-2022 走看看