BZOJ-1923-外星千足虫-SDOI2010

描述


分析

  • 首先看上去这貌似是一个高斯消元的题目, 直觉吧…
  • 每次给出的就相当于是一个方程. 然后很容易想到n条虫子n个x, x_i的系数为0表示这个方程中没有i, 否则为1. 然后系数乘以相应的x再相加模2就是输入的那个结果了.
  • 然后就会发现有两个问题, 首先模怎么办, 然后时间复杂度太大了, 这种加法方程组的高斯消元复杂度是O(n^3)的.
  • 突然想到——加法模2就相当于异或!
  • 所以用高斯消元解这个异或方程组就行了, O(n*m)
  • 一开始分析复杂度分析错了, 以为是O(n*m*二进制位数), 而二进制位数就等于n, 那么还是超时…其实m*二进制位数是不科学的, m表示找到一个合法的方程去消元, 找到就退出了, 并不是每次找都进行一次消元.
  • 还有一次错是因为直接我让高斯消元直接返回i, 也就是最后一次找到的方程的序号.
    • 首先i应该+1因为我从0做下标.
    • 然后+1也不对因为i+1是最后一次用的方程, 而求的是第几次统计后得出解来. 是用到的方程中最靠后的那个.

代码

https://code.csdn.net/snippets/621146

时间: 2025-01-07 10:05:52

BZOJ-1923-外星千足虫-SDOI2010的相关文章

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

[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<ios

【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[

【BZOJ】【1923】【Sdoi2010】外星千足虫

高斯消元解Xor方程组 ZYF Orz 这题……不作死就不会死T^T,用bitset确实比较快,而且可以从string直接转成bitset(构造函数). 但问题是我把转过来以后的顺序搞反了……原本以为是0~n-1是系数,第n位是方程的结果, 事实上bitset和string里的顺序是反过来的!!!!! 所以输出的时候也需要倒序枚举…… 这题我是动态进行高斯消元的…… 前k-1个方程已经消元好,然后加入第k个方程进行消元,从高位到低位(我以为是这样,但事实上由于是逆序,所以……不过不要在意这些细节

[SDOI2010] 外星千足虫

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

bzoj 1923: [Sdoi2010]外星千足虫

1 #include<cstdio> 2 #include<iostream> 3 using namespace std; 4 int n,m,a[2009][2009],st=1; 5 char ch[6009]; 6 bool gao(int a1) 7 { 8 for(int i=st;i<=a1;i++) 9 { 10 int k; 11 for(k=i;k<=a1;k++) 12 if(a[k][i]) 13 break; 14 if(k==a1+1) 15

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