题意:

给出一个n∗mn*mn∗m的矩阵,矩阵每个点为111或000,每行每列均可翻转且只能翻转一次。问能否将矩形通过翻转变成一个从a1.1...a1.ma2.1...an.ma_{1.1}...a_{1.m}\ a_{2.1}...a_{n.m}a1.1​...a1.m​ a2.1​...an.m​数值不下降的状态,如果可以给出每行每列的翻转状态,否则输出NONONO。(1≤n,m≤200)(1\leq n,m\leq 200)(1≤n,m≤200)


思路:

稍微考虑一下这个题目,就可以发现此题难点主要在于一个点是否翻转由该点所代表的行列同时决定,因此我们难以进行判断。

所以我们可以思考能否事先确定行或列的状态,这样判断起来就很方便了。然后就可以发现只要确定了矩阵的最终状态,再确定了第一行的状态,我们就可以确定每一列的状态。确定了每一列状态和矩形最终状态,就可以不断向下循环确定每一行的状态,如果一直都不发生冲突,则为YESYESYES。

我们来考虑一下复杂度。首先枚举矩形的最终状态,即从(n,m)(n,m)(n,m)向(1,1)(1,1)(1,1)不断填111,因此一共有n∗mn*mn∗m个最终状态。对于每个最终状态,我们枚举第一行是否翻转,然后确定每一列的状态,再对剩下的每一行进行判断。因此复杂度为O(n∗m∗n∗m)O(n*m*n*m)O(n∗m∗n∗m)。

这样的复杂度肯定是会TTT的,因此考虑bitsetbitsetbitset优化,对于每一行直接按位异或得到答案,可以将复杂度优化到O(n∗m∗n∗m)/32O(n*m*n*m)/32O(n∗m∗n∗m)/32,因此可以通过此题。具体异或细节见代码。


代码:

#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <cstring>
#include <bitset>
#include <algorithm>
#define __ ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
#define rep(i,a,b) for(int i = a; i <= b; i++)
#define LOG1(x1,x2) cout << x1 << ": " << x2 << endl;
#define LOG2(x1,x2,y1,y2) cout << x1 << ": " << x2 << " , " << y1 << ": " << y2 << endl;
#define LOG3(x1,x2,y1,y2,z1,z2) cout << x1 << ": " << x2 << " , " << y1 << ": " << y2 << " , " << z1 << ": " << z2 << endl;
typedef long long ll;
typedef double db;
const int N = 200+10;
const int M = 1e5+100;
const db EPS = 1e-9;
using namespace std;bitset<N> row,col,norml[2];
bitset<N> mp[N],jud;
bitset<N> base[N];
int n,m;void test()
{col = mp[0]^base[0]^norml[row[0]]; //枚举第一行状态, 确定每一列是否翻转rep(i,1,n-1){jud = base[i]^mp[i]^col; //判断这一行的row是否翻转if(jud.count() == m) row.set(i,1);else if(jud.count() == 0) row.set(i,0);else return;}printf("YES\n");rep(i,0,n-1) printf("%d",row[i]==1); printf("\n");rep(i,0,m-1) printf("%d",col[i]==1); printf("\n");exit(0);
}int main()
{scanf("%d%d",&n,&m);rep(i,0,n-1)rep(j,0,m-1){int xx; scanf("%d",&xx);if(xx == 1) mp[i].set(j);}rep(i,0,m-1) norml[1].set(i);for(int i = n-1; i >= 0; i--)for(int j = m-1; j >= 0; j--){base[i].set(j);row.set(0,1);test();row.set(0,0);test();}printf("NO\n");return 0;
}

【Codeforces Round #555 (Div. 3) G】Inverse of Rows and Columns【bitset优化暴力...】相关推荐

  1. Codeforces Round #644 (Div. 3) G.A/B Matrix

    Codeforces Round #644 (Div. 3) G.A/B Matrix 题目链接 You are given four positive integers n, m, a, b (1≤ ...

  2. Codeforces Round #731 (Div. 3) G. How Many Paths? dfs + 拓扑 + 思维

    传送门 题意: 给你一张nnn个点mmm条边的图,让你对每个点确定一个编号,规则如下: (1)(1)(1) 对于不能到的点编号为000. (2)(2)(2) 对于只有一条路径能到这个点的点编号为111 ...

  3. Codeforces Round #592 (Div. 2) G. Running in Pairs 构造(水)

    传送门 文章目录 题意: 思路: 题意: 思路: 史上最水GGG题,没有之一. 考虑最小的情况如何构造,显然就是让a,ba,ba,b都1−n1-n1−n依次排列即可,这样的最小值为n∗(n+1)2\f ...

  4. Codeforces Round #725 (Div. 3) G. Gift Set 二分

    传送门 文章目录 题意: 思路: 题意: 有两种物品分别有x,yx,yx,y个,每次可以从一个拿出aaa个,另一个拿出bbb个分成一组,问最多能分成多少组. 思路: 这个题有一个显然的单调性,所以二分 ...

  5. Codeforces Round #636 (Div. 3) F. Restore the Permutation by Sorted Segments 思维 + 暴力

    传送门 文章目录 题意: 思路: 题意: n≤200n\le200n≤200 思路: 首先关注到rrr从[2,n][2,n][2,n]都出现一次,所以很明显最后一个位置只出现一次,但是这样倒着来不是很 ...

  6. Codeforces Round #827 (Div. 4) G. Orray

    Problem - G - Codeforces 题意: 给定一个数列,让你重新排列这个数列,使得其前缀或最大 思路: 贪心策略就是找一个与pre或起来最大的值 重点是怎么写呢 感觉div4的题思路都 ...

  7. Codeforces Round #827 (Div. 4) G. Orray 解题报告

    原题链接: Problem - G - Codeforces 题目描述: You are given an array aa consisting of nn nonnegative integers ...

  8. Codeforces Round #693 (Div. 3)G. Moving to the Capital

    题目链接:Problem - G - Codeforces 题目大意:给定一张n个节点m条边的图,定义d数组为每个结点到结点1的距离. 每次可以选择两个操作:1,跳到结点x,dx>d当前 2.跳 ...

  9. Codeforces Round #555 (Div. 3) AB

    A:    http://codeforces.com/contest/1157/problem/A 题意:每次加到10的整数倍之后,去掉后面的0,问最多有多少种可能. 1 #include < ...

  10. Codeforces Round #693 (Div. 3) G. Moving to the Capital dp + 思维

    传送门 题意: 给一个图,111号点为中心点,定义dis[i]dis[i]dis[i]表示111号点到iii的距离.现在有三种移动方式 (1)(1)(1)从iii移动到jjj且dis[i]<di ...

最新文章

  1. 可信平台模块(TPM)概念介绍
  2. 听说GNN大有可为,从这篇开始学以致用
  3. Gurobi 生产计划调度学习案例(含代码实现) (生产切换、装配计划)
  4. XCTF-高手进阶区:web2
  5. 2018--20179215--《文献管理与信息分析》第三讲 英文数据库资源的发展趋势和利用...
  6. 怎么加载csv_python爬虫入门实战(四)!爬取动态加载的页面
  7. 如何在hexo中支持Mathjax
  8. STM32网络电路设计
  9. Cesium中的坐标系及转换
  10. 【SQL】SQL语法树
  11. Python自动检测视频画面的旋转角度
  12. JMeter使用jar进行压力测试
  13. C#学习之泛型功能与限制
  14. thinkphp3.2.3入口文件详解
  15. C语言从入门到精通(第一期之结构框架)
  16. 高性能RPC框架BRPC核心机制分析
  17. 91手机助手官网iPhone版 v5.3.2 官方版
  18. 连接局域网及共享打印机提示操作无法完成(0x00000709)
  19. 黑客电影《我是谁:没有绝对安全的系统》正片(含下载)
  20. 咕咕漫画之弹窗破解去除

热门文章

  1. ios 8 适配须知
  2. word 2007为不同页插入不同页眉页脚
  3. 编程珠玑:位图法排序
  4. RCP之病人信息系统开发总结(4):MVC模式之View层—透视图
  5. vector容器——赋值操作
  6. nginx 正则 结尾 配置_nginx配置proxy_pass中url末尾带/与不带/的区别详解
  7. 大数斐波那契数列(nyoj655)光棍的yy
  8. baidumap vue 判断范围_vue 经典面试题+答案
  9. hdoj1421:搬寝室(dp基础题)
  10. 关于git clone http://xxxxxxxxxxx报错的问题