静态网站是什么样,辽宁建设工程信息网上报名了但未投标可以参加开标吗,网页美工设计工作流程,魔鬼做交易网站正题
题目链接:https://www.luogu.com.cn/problem/CF662C 题目大意 n∗mn*mn∗m的网格上有0/10/10/1#xff0c;可以任意翻转行和列#xff0c;求剩下最少的111。 解题思路
知道是FWTFWTFWT之后就好做很多了。
首先因为nnn很小#xff0c;所以可以考虑枚举翻转的行数可以任意翻转行和列求剩下最少的111。 解题思路
知道是FWTFWTFWT之后就好做很多了。
首先因为nnn很小所以可以考虑枚举翻转的行数我们现在需要对于一个行的翻转状态快速知道最小值。
如果一行状态sss翻转行状态www之后就相当于val(sxorw)val(s\ xor\ w)val(s xor w)反过来也就是若csxorwcs\ xor\ wcs xor w那么sxorcws\ xor\ cws xor cw。
此时就可以上FWTFWTFWT了设valival_ivali表示列状态iii的最小值numinum_inumi表示列状态iii的数量。那么ans(s)∑ixorjsvali×numjans(s)\sum_{i\ xor\ js}val_i\times num_jans(s)i xor js∑vali×numj
上FWTFWTFWT即可时间复杂度O(2nnnm)O(2^nnnm)O(2nnnm) codecodecode
#includecstdio
#includecstring
#includealgorithm
#define ll long long
using namespace std;
const ll N(121);
ll n,m,val[N],num[N],ans;
char s[20][110000];
void FWT(ll *f,ll op){for(ll p2;pn;p1)for(ll k0,lenp1;kn;kp)for(ll ik;iklen;i){ll xf[i],yf[ilen];f[i](xy)/op;f[ilen](x-y)/op;}return;
}
void solve(ll *a,ll *b){FWT(a,1);FWT(b,1);for(ll i0;in;i)a[i]a[i]*b[i];FWT(a,2);return;
}
int main()
{scanf(%lld%lld,n,m);for(ll i0;in;i)scanf(%s,s[i]);ll MS(1n);for(ll i1;iMS;i)val[i]val[i-(i-i)]1;for(ll i0;iMS;i)val[i]min(val[i],n-val[i]);for(ll i0;im;i){ll w0;for(ll j0;jn;j)w(s[j][i]1)j;num[w];}nMS;solve(val,num);ans1e9;for(ll i0;in;i)ansmin(ans,val[i]);printf(%lld\n,ans);
}