题目 P2447 [SDOI2010]外星千足虫 解析 sol写到自闭,用文字描述描述了半个小时没描述出来,果然还是要好好学语文 用高斯消元求解异或方程组. 因为 \(奇数\bigoplus奇数=偶数\) \(偶数\bigoplus偶数=偶数\) \(奇数\bigoplus偶数=奇数\) \(0\)为偶数,\(1\)为奇数, \((奇数+奇数)\mod 2=0\) \((偶数+偶数)\mod 2=0\) \((奇数+偶数)\mod 2=1\) 若把第一个里面的奇偶数分别换成\(1\)和\(0\)…
P2447 [SDOI2010]外星千足虫 题目描述 公元2089年6月4日,在经历了17年零3个月的漫长旅行后,“格纳格鲁一号”载人火箭返回舱终于安全着陆.此枚火箭由美国国家航空航天局(NASA)研制发射,行经火星.金星.土卫六.木卫二.谷神星.“张衡星”等23颗太阳系星球,并最终在小行星“杰森星”探寻到了地外生命.宇航员在“杰森星”地表岩层下45.70米位置发现一批珍贵的活体生命样本,并将其带回检测.在带回的活体样本中,最吸引人的当属这些来自外星的千足虫了.这些虫子身躯纤长,身体分为若干节.…
题目链接:https://www.luogu.org/problemnew/show/P2447 dalao们都说简单...解异或方程组 可我不是dalao qwq #include <algorithm> #include <cstdio> #include <cmath> #include <iostream> #include <bitset> using namespace std; ; ; char s[maxn]; bitset<…
原题传送门 根据题意,题目给的每个操作就相当于异或上选中的那几只虫子的足数(mod 2)等于0/1 这是一个异或方程组,珂以用高斯消元解出每个虫子的足数(mod 2).所需最小次数或判断有多解 但是看题目数据范围\(n \leq 1000,m \leq 2000\),如果直接高斯消元\(O(n^2m)\)的话超时无疑 观察这题的个性:方程组中要通过上下行异或进行消元,这是位运算,一定珂以用bitset优化 我们对每一行开一个bitset,这样消元时直接把两行的bitset异或起来,复杂度为\(O…
高斯消元 + bitset 简介: 高斯消元其实就是以加减消元为核心求唯一解.这道题还是比较裸的,可以快速判断出来.我们将每一只虫子看作一个未知数,这样根据它给出的 m 组方程我们可以高斯消元得出每一只虫子的归属地.如果你还不清楚高斯消元的原理可以移步此处 如果你只是以为这是一道板子题自信提交,那么恭喜你,你将会获得TLE的好成绩.为什么呢?我们知道高斯消元是 \(n^3\) 复杂度的,而本题数据范围 $ n \leq 1000\(,\) m \leq 2000$,明显会卡出TLE. 于是乎,b…
题目大意:有$n$个数,每个数为$0$或$1$,给你其中一些关系,一个关系形如其中几个数的异或和是多少,问最少知道前几个关系就可以得出每个数是什么,并输出每个数 题解:异或方程组,和高斯消元差不多,就是把加减改成了异或. 卡点:用$bitset$优化,输出时输反了 C++ Code: #include <algorithm> #include <iostream> #include <bitset> #define maxn 1010 #define maxm 2010…
题意 给定 \(n\) 个变量和 \(m\) 个异或方程,求最少需要多少个才能确定每个变量的解. \(\texttt{Data Range:}1\leq n\leq 10^3,1\leq m\leq 2\times 10^3\) 题解 高斯消元解异或方程组. 求解这个东西可以直接高斯约旦法,主要问题是第一问. 注意,第一问不等同于求矩阵的秩,因为要求是选一段前缀,矩阵的秩是可以任意选的. 这个时候考虑对选主元过程进行贪心,每一次拿那个位置最前面并且满足条件的当主元来消即可.因为拿靠后的那个方程来…
题意 题目链接 Sol 异或高斯消元的板子题. bitset优化一下,复杂度\(O(\frac{nm}{32})\) 找最优解可以考虑高斯消元的过程,因为异或的特殊性质,每次向下找的时候找到第一个1然后交换就行,这样显然是最优的 #include<bits/stdc++.h> using namespace std; const int MAXN = 2001; inline int read() { char c = getchar(); int x = 0, f = 1; while(c…
一开始以为是异或高斯消元,实际上是简单线性基. 直接往线性基里插入,直到线性基满了就解出来了. // luogu-judger-enable-o2 #include<bits/stdc++.h> #define il inline #define vd void typedef long long ll; il int gi(){ int x=0,f=1; char ch=getchar(); while(!isdigit(ch)){ if(ch=='-')f=-1; ch=getchar()…
怎么说呢? 因为是在mod 2 意义下的吗(一般是遇到二就可能是位运行算或二分图) 就可以利用异或计算. 因为奇数和偶数在二进制上就用判断最后一位就可以了 然后因为异或符合交换律和结合律 直接消元就可以辣 不过对于这个题,输出第一个数字可能是对与我这种蒟蒻的一个挑战.所以,我会在代码中详细的注释 bitset #include<cstdio> #include<algorithm> #include<iostream> #include<bitset> us…