[SDOI2010](洛谷P2447 )外星千足虫

外星千足虫

题目链接

首先,它一看题解就是个高斯消元

只是改成了奇偶性的判断

性质:

奇数+奇数=偶数

奇数+偶数=奇数

偶数+奇数=奇数

偶数+偶数=偶数

于是我们用1表示奇数,0表示偶数

1+1=0

1+0=1

0+1=1

0+0=0

这个"+"好像可以换成"^" 。。。

于是开始搞死高斯消元

 1 // luogu-judger-enable-o2
 2 #pragma GCC optimize ("O3")
 3 #include<iostream>
 4 #include<cstdio>
 5 #include<bitset>
 6 using namespace std;
 7 int n,m,R;
 8 bitset<10010> a[20010],ans;
 9 char s[10010];
10 inline void read(int line)
11 {
12     scanf("%s",s);
13     for(int i=1;i<=n;i++)
14      a[line][i]=s[i-1]-‘0‘;
15     getchar();
16     char c=getchar();
17     a[line][n+1]=c-‘0‘;
18 }
19 inline bool Gauss()                        //高斯消元模板
20 {
21     for(register int i=1;i<=n;i++)
22     {
23         int j=i;
24         while(!a[j][i]&&j<=m) j++;        //向下找到为1的一行
25         if(j==m+1) return 0;
26         R=max(j,R);                        //需要用到的行的最大行号
27         if(i!=j) swap(a[i],a[j]);
28         for(register int j=i+1;j<=m;j++)            //消元,将矩阵变换为上三角矩阵
29          if(a[j][i]&&i!=j) a[j]^=a[i];
30 //        for(int k=1;k<=m;k++,puts(""))
31 //         for(int l=1;l<=n+1;l++)
32 //          cout<<a[k][l]<<‘ ‘;
33 //        puts("");
34     }
35     return 1;
36 }
37 int main()
38 {
39     scanf("%d%d",&n,&m);
40     for(int i=1;i<=m;i++) read(i);
41     if(Gauss())
42     {
43         printf("%d\n",R);
44         for(register int i=n;i>=1;i--)    //回代
45         {
46             ans[i]=a[i][n+1];
47             for(register int j=i+1;j<=n;j++)
48              if(a[i][j]&&ans[j]) ans[i]=!ans[i];    //只有奇数对当前答案产生影响
49         }
50         for(register int i=1;i<=n;i++)
51          if(ans[i]) puts("?y7M#");
52          else puts("Earth");
53     }
54     else puts("Cannot Determine");
55     return 0;
56 }

原文地址:https://www.cnblogs.com/yjkhhh/p/8963571.html

时间: 2024-10-15 01:49:23

[SDOI2010](洛谷P2447 )外星千足虫的相关文章

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”则代表编

【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”则代表编号为

题解 外星千足虫(线性基+高斯消元)

题解 luogu外星千足虫(线性基+高斯消元) 题目 luogu题目传送门 题解想法 首先需要知道这是个异或方程对吧 然后既然看到位运算,又有这么多,就可以考虑线性基(做题技巧),那我们就丢进去 接下来看一看线性基,哇,性质美妙 它不就是Gauss消元里面想要的上三角矩阵吗 所以说: 如果能拼成线性基,那么枚举到哪里完成了,就输出位置(first_ans) 如果拼不成,那就解不出(毋庸置疑) 那真是美妙啊... 所以怎么消元呢?这可是个异或方程,我们要解出来啊 枚举整个线性基的g[i] 如果g[

[SDOI2010] 外星千足虫

Description 公元2089年6月4日,在经历了17年零3个月的漫长旅行后,"格纳格鲁一号"载人火箭返回舱终于安全着陆.此枚火箭由美国国家航空航天局(NASA)研制发射,行经火星.金星.土卫六.木卫二.谷神星."张衡星"等23颗太阳系星球,并最终在小行星"杰森星"探寻到了地外生命.宇航员在"杰森星"地表岩层下45.70米位置发现一批珍贵的活体生命样本,并将其带回检测.在带回的活体样本中,最吸引人的当属这些来自外星的千足

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 在给定数据存在唯一解时有

[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