黑白矩阵 题解

1<=n,m<=100,1<=k<=10,T<=50

首先这个同色极大连通块都是矩形说明了啥呢?

相邻两行(两列)一定是同色或者反色的。

当n>k时,我们可以发现有一行肯定是不会被修改的,我们枚举那一行统计一下即可。

否则n<=10,那么我们枚举修改完之后某一列的状态,2^n枚举就行了。

这真是一道**题啊。

(下面这段代码的cnt1比较不和谐,可能要修改一下)

#include <iostream>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <time.h>
#include <stdlib.h>
#include <string>
#include <bitset>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <algorithm>
#include <sstream>
#include <stack>
#include <iomanip>
using namespace std;
#define pb push_back
#define mp make_pair
#define pii pair<int,int>
#define ll long long
#define ld double
#define vi vector<int>
#define fi first
#define se second
#define fe first
#define cnt1 __builtin_popcount
int T,n,m,k;
int arr[233][233],orz[233];
bitset<103> bs[233],fbs[233];
void sol()
{
    scanf("%d%d%d",&n,&m,&k);
    for(int i=0;i<n;i++) bs[i]=bitset<103>();
    for(int i=0;i<n;i++) fbs[i]=bitset<103>();
    for(int j=0;j<m;j++) orz[j]=0;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        scanf("%d",&arr[i][j]), bs[i][j]=arr[i][j], fbs[i][j]=!arr[i][j]
        , orz[j]=orz[j]*2+arr[i][j];
    }
    //乱搞
    if(n>k)
    {
        int ans=2000000000;
        for(int i=0;i<n;i++)
        {
            int cnt=0;
            for(int j=0;j<n;j++)
            cnt+=min((bs[i]^bs[j]).count(),(bs[i]^fbs[j]).count());
            ans=min(ans,cnt);
        }
        if(ans>k) puts("-1");
        else printf("%d\n",ans);
        return;
    }
    int ans=2000000000;
    for(int i=0;i<(1<<n);i++)
    {
        int cnt=0;
        for(int j=0;j<m;j++)
        cnt+=min(cnt1(orz[j]^i),cnt1(orz[j]^i^((1<<n)-1)));
        ans=min(ans,cnt);
    }
    if(ans>k) puts("-1");
    else printf("%d\n",ans);
}
#define FO(x) {freopen(#x".in","r",stdin);freopen(#x".out","w",stdout);}
int main()
{
    FO(table)
    scanf("%d",&T);
    while(T--) sol();
}
时间: 2024-08-27 02:30:49

黑白矩阵 题解的相关文章

Android ColorMatrix 亮度矩阵 对比度矩阵 黑白矩阵

颜色矩阵M是5*4的矩阵,android中颜色矩阵M是以一维数组m=[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t]的方式进行存储的. 矩阵的每行分别是: R[a b c d e] G[f g h i j] B[k l m n o] A[p q r s t] 图像的RGBA值则存储在一个5*1的颜色分量矩阵C中,要想改变一张图片的颜色效果,只需要改变图像的颜色分量矩阵即可. 在对ColorMatrixFilter过滤时候,传入的这个参数ColorMatrix,首

cojs QAQ的矩阵 题解报告

题目描述非常的清晰 首先我们考虑(A*B)^m的求法,这个部分可以参考BZOJ 杰杰的女性朋友 我们不难发现(A*B)^m=A*(B*A)^(m-1)*B A*B是n*n的矩阵,而B*A是k*k的矩阵,这样就大大缩小了矩阵的大小 因为矩阵乘法满足结合律,我们先对(B*A)做快速幂,之后乘一下就可以了 之后我们考虑如果没有(i-1)^3的这个系数怎么求G(i)的前缀和 因为矩阵乘法满足分配率,我们利用矩阵倍增((B*A)^0+(B*A)^1……+(B*A)^(m-1))之后乘一下就可以了 之后我们

bzoj 4500 矩阵 题解

题意: 有一个 $ n * m $ 的矩阵,初始每个格子的权值都为 $ 0 $,可以对矩阵执行两种操作: 选择一行,该行每个格子的权值加1或减1. 选择一列,该列每个格子的权值加1或减1. 现在有 $ K $ 个限制,每个限制为一个三元组 $ (x,y,c) $ ,代表格子$ (x,y) $ 权值等于 $ c $ .问是否存在一个操作序列,使得操作完后的矩阵满足所有的限制.如果存在出" $ Yes $ ",否则输出" $ No $ ". 这道题是个一个查分约束题,它

蛇形矩阵-题解

题目描述 蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形. 输入 本题有多组数据,每组数据由一个正整数N组成.(N不大于100) 输出 对于每一组数据,输出一个N行的蛇形矩阵.两组输出之间不要额外的空行.矩阵三角中同一行的数字用一个空格分开.行尾不要多余的空格. 样例输入 5 样例输出 1 3 6 10 15 2 5 9 14 4 8 13 7 12 11 用二维数组: #include <iostream> #include <cstdio> using namespac

HDU 5671 矩阵

Matrix Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 271    Accepted Submission(s): 126 Problem Description There is a matrix M that has n rows and m columns (1≤n≤1000,1≤m≤1000) .Then we per

ZROI WC Round5 题解

ZROI WC Round5 题解 Problem A 题意 给定一个长度为 \(n\) 的序列,操作是交换两个相邻的数,要求将序列变成先单调不降再单调不升,求最小操作数,注意可以完全单调不降或者完全单调不升 想法 发现最小的数一定在最左侧或者最右侧 有一个暴力的做法是按照从小到大的顺序,每次看向哪边比较近就交换到哪一侧,由于不管交换到哪一个剩下的序列都是一样的,所以这个做法是正确的 下面就是优化这个算法,不难发现一个数如果移动到最左侧,那么它左侧的比它小的数肯定都移动到左侧,所以可以用树状数组

[Codeforces]#179 div1-----295ABCDE

摘自我的github:https://github.com/Anoxxx The Solution Source: Codeforces Round #179 (Div. 1) VJudge链接: https://cn.vjudge.net/contest/167920#problem CodeForces链接: http://codeforces.com/problemset/problem/295 #A Greg and Array Time limit: 1500 ms Memory li

一些关于机器视觉的概念

http://blog.csdn.net/douglax/article/details/9528297 视觉引导的运动 如果你的应用需要一个视觉系统来引导机器人,那么必须知道视觉系统与运动系统是如何集成的.对于校准和操作,没集成的运动系统与视觉系统是初步的系统,机械人或机构和视觉系统是分开校准的.在操作中,一台独立的视觉系统根据在视觉坐标系统中的已知位置计算出零件位置的偏移量,然后发指令给机器人的手臂在离初始化编程的拾取位置的偏移量处拾取零件. 由于机器视觉系统可以快速获取大量信息,而且易于自

hdu2818行列匹配+排序

题意:给定一个矩阵,矩阵上有的数字是1,有的是0,给定两种操作,交换某两行或者某两列,问是否能置换出对角线为1的矩阵 题解:能够置换出对角线是1的矩形要求有n个1既不在同一行也不再同一列,即行列匹配,所以匹配很简单,关键是怎么求出交换的过程, cx[i] 表示第i行与第cx[i]列匹配,即第i行要变成第cx[i]行所以将cx从小到大排序,记录交换的的下标,那么就是所需要的结果.因为要求交换次数不能超过1000,所以用选择排序 1 #include <stdio.h> 2 #include &l