CF662C Binary Table 枚举 FWT】的更多相关文章

题面 洛谷题面 (虽然洛谷最近有点慢) 题解 观察到行列的数据范围相差悬殊,而且行的数量仅有20,完全可以支持枚举,因此我们考虑枚举哪些行会翻转. 对于第i列,我们将它代表的01串提取出来,表示为\(v[i]\), 然后我们假设有第0列,其中的第i行如果是1,表示这行将会翻转. 那么可以发现,执行完对行的操作时,每一列的状态为\(x = v[i] \oplus v[0]\),此时我们只需要考虑对列的操作,令\(cnt[i]\)表示状态为\(i\)时01串中1的个数. 显然为了使得1的个数尽可能少…
CF662C Binary Table 题意: 给出一个\(n\times m\)的\(01\)矩阵,每次可以反转一行或者一列,问经过若干次反转之后,最少有多少个\(1\) \(n\le 20, m\le 10^5\) 题解: 可以把每一列看作一个二进制数,这样得到\(m\)个二进制数,记为\(A\),翻转第\(i\)列就相当于把每个二进制数异或上\(1<<i\),由于\(n\)很小,所以枚举所有的翻转组合,一共\(2^n\)种,令\(d(x)\)表示最高位为\(n\)的二进制数中\(0\)和…
复习了一发FWT,发现还挺简单的... 没时间写了,就放一个博客吧:Great_Influence 的博客 注意这一句ans[i]=∑j⊗k=i​f[j]∗dp[k]ans[i]= ∑_{j⊗k=i} ​ f[j]∗dp[k]ans[i]=j⊗k=i∑​​f[j]∗dp[k] 本来应该是j⊗i=kj⊗i=kj⊗i=k,变一下就是j⊗k=ij⊗k=ij⊗k=i 然后就是板子了 好强.. CODE #include <bits/stdc++.h> using namespace std; cons…
题意: https://www.cnblogs.com/cjyyb/p/9065801.html 题解:…
CF662C Binary Table 一道 FWT 的板子-比较难想就是了 有一个 \(n\) 行 \(m\) 列的表格,每个元素都是 \(0/1\),每次操作可以选择一行或一列,把 \(0/1\) 翻转,即把 \(0\) 换为 \(1\) ,把 \(1\) 换为 \(0\) .请问经过若干次操作后,表格中最少有多少个 \(1\). \(1 \leq n \leq 20\) \(1 \leq m \leq 10^5\) 先说说 FWT 干嘛的吧 \(F_k = \sum_{i \oplus j…
[CF662C]Binary Table(FWT) 题面 洛谷 CF 翻译: 有一个\(n*m\)的表格(\(n<=20,m<=10^5\)), 每个表格里面有一个\(0/1\), 每次可以将一行或者一列的\(01\)全部翻转 回答表格中最少有多少个\(1\) 题解 发现\(n\)很小,\(m\)很大 状压是跑不掉了 如果我们确定翻转哪些行,那么答案唯一确定(贪心的选每一列中\(0/1\)的较小值) 相同的列显然可以合并, 把每一列按照\(01\)状压,记\(a[i]\)为状态为\(i\)的列…
传送门 \(N \leq 20\)很小诶 一个暴力的思路是枚举行的翻转状态然后在列上贪心 复杂度为\(O(2^NM)\)显然过不去 考虑到可能有若干列的初始状态是一样的,那么在任意反转之后他们贪心的策略肯定是相同的 考虑状压,设\(f_i\)表示初始状态为\(i\)的列的个数,\(g_i\)表示经过行反转,某一列到达\(i\)状态时,这一列留下的最少的\(1\)的可能个数,\(h_i\)表示行翻转状态为\(i\)时的答案 那么\(h_i = \sum\limits_{j\ xor\ k = i}…
题目链接 CF662C 题解 行比较少,容易想到将每一列的状态压缩 在行操作固定的情况下,容易发现每一列的操作就是翻转\(0\)和\(1\),要取最小方案,方案唯一 所以我们只需求出每一种操作的答案 如果操作的行的集合为\(S\),那么对于状态为\(e\)的列,将会变成\(e \; xor \; S\),同时产生\(e \; xor \; S\)的答案 如果\(s\)的答案记为\(b[s]\),状态为\(s\)的列数量为\(a[s]\) 那么对于操作\(S\),最后的答案为 \[\sum\lim…
题面 题解 我们会发现,如果单独的一列或一行,它的答案是O1确定的,如果确定了每一行是否变换,那么最后的答案也就简单了许多, 如果确定了行的变换状压下来是x(即x的i位表示第i行是否变换,理解就行),那么每列的状态就要异或x,这没问题吧 接着,其实它的行列是可以交换顺序的,对答案没有影响,状态一定的列的最终贡献都一样, 所以就把状态为 i 的列的数量记为 c[i],方便计算, 然后,提前预处理出列的状态为 i 时单独考虑的答案 f[i](即反转或不反转的最小1数量),方便计算 若枚举行的变换x,…
题目 Source http://codeforces.com/contest/663/problem/E Description You are given a table consisting of n rows and m columns. Each cell of the table contains either 0 or 1. In one move, you are allowed to pick any row or any column and invert all value…
luogu 题意 你有一个\(n*m\)的\(01\)矩阵.你可以把任意一行或者一列的\(01\)取反.求矩阵中最少的\(1\)的数量. \(n\le20,m\le10^5\) sol 很自然地有一个\(O(2^nm)\)的暴力:枚举横行的取反情况,然后纵列就取\(01\)数量较少的一者. 我们记状态\(x\)在原矩阵中的出现次数为\(a[x]\),状态中\(01\)较少一者的数量为\(b[x]\). 会发现当最终的取反状态为\(i\)时,会有\(ans_i=\sum_{j\otimes k=i…
[CF662C]Binary Table 题意:给你一个$n\times m$的01网格,你可以进行任意次操作,每次操作是将一行或一列的数都取反,问你最多可以得到多少个1? $n\le 20,m\le 10^5$ 题解:我也不知道叫啥了,说状压也不对,说fwt也不太对,就叫按位处理得了. 显然有$O(2^nm)$暴力,先枚举每行是否取反,然后枚举每列,如果0多就取反,否则不取. 但我们发现我们完全可以将本质相同的列一起处理,什么叫本质相同的列呢?假如我们对每行是否取反的状态为S,则所有$xor…
「CF662C」 Binary Table 题目链接 题目所给的 \(n\) 很小,于是我们可以考虑这样一种朴素做法:暴力枚举第 \(i\) 行是否翻转,这样每一行的状态就确定了,这时取每一列 \(0/1\) 个数较小的数字即可(因为每一列也可以翻转).这样的时间复杂度是 \(O(m\cdot2^n)\). 但是显然这样过不了. 我们发现表格的具体行列对我们的答案是没有影响的.即我们只需要知道状态为 \(x\) 的行或者状态为 \(x\) 的列的个数即可.由于 \(n\le20\),这启发我们对…
C. Binary Table 题目连接: http://codeforces.com/problemset/problem/662/C Description You are given a table consisting of n rows and m columns. Each cell of the table contains either 0 or 1. In one move, you are allowed to pick any row or any column and i…
Binary Table (Hard Version) 题意 \(n*m(2\le n,m\le 100)\) 的01矩阵,每次可以选择一个宽度为2的子矩阵,将四个位置中的任意3个进行翻转,即0变1,1变0.要求构造操作次数小于 \(n*m\) 的方案,使得该矩阵最终变成一个全0矩阵. 分析 构造方法可能有很多种,只要能够满足题意即可. 从第一行开始到倒数第三行,逐列扫描,假设当前扫描的位置为 (i,j),且当前位置为1,那么执行操作一或者操作二.\(i\le n-2\) ,只扫描前 \(n-2…
题目链接 \(Description\) 给定一个\(n\times m\)的\(01\)矩阵,你可以选择一些行和一些列并将其中所有的\(01\)反转.求操作后最少剩下多少个\(1\). \(n\leq20,m\leq10^5\). \(Solution\) \(n\)这么小,要想到一是可以状压状态,二是可以枚举选了哪些行. 发现在确定了选哪些行之后,每一列的选择是确定的(取变与不变后得到的状态中\(1\)较少的那个). 那么假设\(y\)为这一列的最终状态(可以状压表示出来),则这一列的答案为…
题目 好吧,我连板子都不会了 有一个非常显然的做法就是\(O(2^nm)\)做法就是枚举每一行的状态,之后我们贪心去看看每一列是否需要翻转就好啦 显然这个做法非常垃圾过不去 首先我们发现每一列都不超过\(20\),考虑把每一列都压成一个状态 我们考虑设一些奇怪的东西 设\(g_i\)表示行的翻转状态为\(i\)的最优解,\(f_i\)表示有多少列的状态为\(i\),\(dp_i\)表示\(i\)这个状态最少有多少个\(1\) 显然\(dp_i=min\{bit(i),n-bit(i)\}\) 我…
大意: 给定$nm$大小的$01$矩阵, $1\le n\le 20,1\le m\le 1e5$, 可以任选行列翻转, 求最终$1$总数最少为多少. 显然有$O(m2^n)$的暴力算法 也就是枚举翻转哪些行, 然后对于一列, 若$1$的个数多于$0$的个数就翻转. 可以发现对于相同的列, 翻转行对它的影响是相同的. 用$a_i$记录状态为$i$的列的个数, $b_i$记录状态为$i$的列的贡献. 假设翻转行状态为$S$时答案为$f_{S}$, 枚举每种状态的列的贡献, 就有 $$f_{S}=\…
题意:给一个N*M的0-1矩阵,可以进行若干次操作,每次操作将一行或一列的0和1反转,求最后能得到的最少的1的个数. 分析:本题可用FWT求解. 因为其0-1反转的特殊性且\(N\leq20\),将每一列j视作一个N位二进制数\(A[j]\),则一共有M个N位数,则可以统计出每个二进制数i的个数\(num[i]\).将所有的行反转操作组合也视作一个N位二进制数\(S\). 那么如何将本题与FWT结合? 首先根据异或运算的结合律:\(S\oplus A[j]=B\),则\(S = A[j] \op…
题目 Codeforces 题目链接 分析 大佬博客,写的很好 本蒟蒻就不赘述了,就是一个看不出来的异或卷积 精髓在于 mask对sta的影响,显然操作后的结果为mask ^ sta AC code #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long LL;//必须用long long,过程中可能炸int const int MA…
听说这是一道$ Tourist$现场没出的题 Codeforces #662C 题意: 给定$n*m的 01$矩阵,可以任意反转一行/列($0$变$1$,$1$变$0$),求最少$ 1$的数量 $ n<=20 \ m<=100000$ $ Solution$ 考虑暴力 枚举每一行反转/不反转 预处理$ g(s)$表示某状态为$ s$的列的最少$ 1$的数量 显然$ g(s)=min(popcount(s),n-popcount(s))$ 枚举每行是否反转之后直接$ O(m)$计算即可 时间复杂…
http://codeforces.com/contest/662/problem/C 题意:n行m列01矩阵,每次可以反转一行或一列,问最后最少可以剩下多少个1 n只有20,把行状态压缩 操作奇数次相当于1次,操作偶数次相当于不操作 所以可以枚举对行的操作,将操作也状态压缩 A[i] 表示有多少列的状态为i B[i] 表示 状态为i时的最优解,即fanzh C[i] 表示 操作i的最优解 执行一次行操作相当于给某一列的状态异或上操作的状态 C[opt] = Σ A[state]*B[opt x…
用FWT优化计算. 首先发现行数很小,想到一个暴力的方法,就是以一个二进制位$0$表示这一行不翻转而二进制位$1$表示这一行翻转,然后$2^n$枚举出所有行的翻转情况,再$O(m)$计算所有的结果. 用$a_i$表示第$i$列的原来的情况,有计算式: $$ans_s = \sum_{i = 1}^{m}(a_i \oplus s) * min(bit_{a_i \oplus  s}, n - bit_{a_i \oplus s})$$ 这里的$bit_i$表示$i$的二进制表示中$1$的个数.…
$n \leq 20,m \leq 100000$的01矩阵,可整行整列01翻转,问最少剩几个1. 一个暴力的做法是枚举$2^n$种行翻转然后$m$列扫一遍.但其实在行翻转情况确定的情况下我们只关心两个东西:某一列在行翻转后剩几个1,以及有几个这样的列.$f(i,j)$--在行翻转$j$的情况下,有$i$个1的有多少列.其实就是与$j$有$i$个位不同的有多少列.可以枚举每一个位置$p$,那么这一位上与$j$不同的状态$f(i-1,j \ \ xor \ \ 2^p)$可以加过来,但要挑去其中$…
某变换好题.不过听说还有O(2^n*n^2)DP的…… Description 给定一个n*m的01矩阵,你可以选择对任意行和任意列取反,使得最终“1”的数量尽量少. Input 第一行两个整数n,m. 接下来n行,每行m个字符,描述一个01矩阵. Output 一个整数表示最少的1的数量. Sample Input 3 4 0110 1010 0111 Sample Output 2 HINT 1 <= n <= 20,1 <= m <= 100000. Solution 首先发…
题目链接 题目大意:给定一个棋盘,棋盘上有0或1,你可以将一整行取反或者一整列取反,要使得最后剩的1最少.\((1\le n\le 20,1\le m\le 100000)\). 一个容易想到的思路就是先枚举行是否取反,然后列就看1的个数是否大于\(\frac{n}{2}\)考虑是否取反. 我们设函数\(f(x)\)表示\(min(x_0,x_1)\),\(x\)在二进制状态下0或1最少的个数. 我们设行的取反状态为\(k\),每列的最终状态就是\(sta[i]\ xor\ k\),对答案的贡献…
传送门 分析 我们发现n特别小,所以可以从这里入手 我们记录出所有列中某一种状态的列有多少个 我们再记录出每种列最少有多少个1(原来的1的个数和取反后的个数去最小值) 于是我们可以得出对于所有列异或一个数的答案 (实际就是对于每一行有一个全异或1或不异或的操作,将所有行压起来) 于是我们不难得到式子$Ans_i = \sum a_j * b_{j^i}$ 直接fwt即可 代码 #include<iostream> #include<cstdio> #include<cstri…
题目传送门:CF 题目大意: 给定一个\(n\times m\)的表格\((n\leqslant 20,m\leqslant 10^5)\) 每个表格中有\(0/1\),每次可以将一行或者一列翻转,问表格中最少有多少个1 首先\(n\)很小,状压是肯定躲不掉了-- 然后我们发现,只要确定了翻转一些行,那么答案必然唯一确定(每列取\(\min\{Num_0,Num_1\}\)) 于是我们设\(f[i]\)表示翻转行状态为\(i\)的答案 统计答案的时候,相同状态的列是可以合并的,所以我们设\(C[…
目录 与卷积: 代码: 或卷积: 代码: 异或卷积: 代码: FST:子集卷积 代码: 例题: CF914G 代码: uoj310[UNR #2]黎明前的巧克力 代码: CF662C Binary Table 代码: FWT可以解决位运算卷积问题. 即\(h(i)=\sum\limits_{j⊕k=i} f(j)*g(k)\),其中"⊕"表示位运算. 与卷积: 定义\(f\)到\(F\)的变换:\(F(i)=\sum\limits_{j\&i==i}^{ }f(j)\). 这样…
打算写一个多项式总结. 虽然自己菜得太真实了. 好像四级标题太小了,下次写博客的时候再考虑一下. 模板 \(FFT\)模板 #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <cctype> #include <algorithm> #define rin(i,a,b)…