zoukankan      html  css  js  c++  java
  • CF 633 E. Binary Table

    题目链接

    题目大意:给定一个棋盘,棋盘上有0或1,你可以将一整行取反或者一整列取反,要使得最后剩的1最少。((1le nle 20,1le mle 100000))

    一个容易想到的思路就是先枚举行是否取反,然后列就看1的个数是否大于(frac{n}{2})考虑是否取反。

    我们设函数(f(x))表示(min(x_0,x_1))(x)在二进制状态下0或1最少的个数。

    我们设行的取反状态为(k),每列的最终状态就是(sta[i] xor k),对答案的贡献就是(f(sta[i] xor k))

    所以我们构造(g(x))表示初始状态为(x)的列的数量。答案函数(A(x))表示行的取反状态为(x)的答案,则(A=f*g)

    代码:

    #include<bits/stdc++.h>
    #define ll long long
    
    using namespace std;
    inline int Get() {int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}while('0'<=ch&&ch<='9') {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;}
    
    int n,m;
    int s[25][100005];
    ll f[1<<20],g[1<<20];
    int Count(int s) {
    	int ans=0;
    	for(;s;s>>=1) ans+=s&1;
    	return ans;
    }
    
    void FWT_xor(ll *a,int n,int flag) {
    	for(int len=2;len<=n;len<<=1) {
    		for(int mid=len>>1,i=0;i<n;i+=len) {
    			for(int j=0;j<mid;j++) {
    				ll u=a[i+j],v=a[i+j+mid];
    				a[i+j]=u+v,a[i+j+mid]=u-v;
    				if(flag==-1) a[i+j]/=2,a[i+j+mid]/=2;
    			}
    		}
    	}
    }
    
    char t[100005];
    int main() {
    	n=Get(),m=Get();
    	for(int i=1;i<=n;i++) {
    		scanf("%s",t+1);
    		for(int j=1;j<=m;j++)	
    			s[i][j]=t[j]-'0';
    	}
    	for(int i=1;i<=m;i++) {
    		int now=0;
    		for(int j=1;j<=n;j++) now=(now<<1)|s[j][i];
    		g[now]++;
    	}
    	for(int s=0;s<(1<<n);s++) {
    		f[s]=Count(s);
    		f[s]=min(f[s],n-f[s]);
    	}
    	FWT_xor(f,1<<n,1),FWT_xor(g,1<<n,1);
    	for(int i=0;i<(1<<n);i++) f[i]*=g[i];
    	FWT_xor(f,1<<n,-1);
    	ll ans=1e9;
    	for(int i=0;i<(1<<n);i++) ans=min(ans,f[i]);
    	cout<<ans;
    	return 0;
    }
    
    
  • 相关阅读:
    git .gitignore不生效的解决方法
    python 爬虫中常需要睡眠防止被封IP time sleep
    Python 实现字典操作详解
    Python遍历字典到列表中出现覆盖前面数据或者字典对值(值为列表)赋值出现重复的问题
    小红书app之shield 逆向
    淘宝h5 页面 sign加密算法
    jemter-base64加密
    Python 中更优雅的日志记录方案
    logging再学习
    elasticsearch中must和should条件同时满足
  • 原文地址:https://www.cnblogs.com/hchhch233/p/10046801.html
Copyright © 2011-2022 走看看