2020ICPC·小米 网络选拔赛第一场(Matrix Subtraction (二维差分))
题目传送门
Matrix Subtraction
题目大意
给你一个 n × m n×m n×m的矩阵,每次可从矩阵中选择一个大小为 a × b a×b a×b的矩阵,使得该子矩阵的值全部减一
求最后能否使得整个矩阵值全部减为0
前置知识点
二维差分维护区间修改,复杂度 O ( n m ) O(nm) O(nm)
思路
采取差分矩阵存储矩阵
从左上开始遍历矩阵,
若当前位置的值不为0,则以当前位置为子矩阵的左上角开始构建子矩阵,子矩阵所有值减去当前位置的值
若有操作使得当前位置的值小于0,则无法使得整个矩阵值全为0
若当前位置的值不为0,并且无法以当前位置为子矩阵左上角构建子矩阵则无法使得整个矩阵值全为0
AC Code
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<math.h>
using namespace std;
#define endl '\n'
#define INF 0x3f3f3f3f
#define int long long
#define debug(a) cout<<#a<<"="<<a<<endl;
// #define TDS_ACM_LOCAL
typedef long long ll;
const double PI=acos(-1.0);
const double e=exp(1.0);
const int M=1e9+7;
const int N=1009;
inline int mymax(int x,int y){return x>y?x:y;}
inline int mymin(int x,int y){return x<y?x:y;}
inline int read(){int x=0, f=0;char ch=getchar();while(ch<'0'||ch>'9') f|=ch=='-',ch=getchar();while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+(ch^48),ch=getchar();return f?-x:x;
}
inline void write(int x){ if(x < 0) {putchar('-');x = -x;} if(x > 9) write(x/10);putchar(x % 10 + '0');
}
int n, m, a, b;
long long x[N][N], d[N][N];
// 二维差分的区间修改
void add(int x, int y, int a, int b, int v){d[x][y]+=v;d[x+a][y+b]+=v;d[x+a][y]-=v;d[x][y+b]-=v;
}void solve(){memset(d,0,sizeof(d));n=read(); m=read(); a=read(); b=read();for(int i=1; i<=n; i++){for(int j=1; j<=m; j++){x[i][j]=read();d[i][j]=x[i][j]-x[i-1][j]-x[i][j-1]+x[i-1][j-1];// 构造差分矩阵// add(i,j,1,1,x[i][j]);}}int flag=0;for(int i=1; i<=n && !flag; i++){for(int j=1; j<=m && !flag; j++){// 从左上开始求得当前位置的值d[i][j]=d[i][j]+d[i-1][j]+d[i][j-1]-d[i-1][j-1];if(d[i][j]!=0){if(d[i][j]<0) flag=1;else{if(i+1-1>n || j+b-1>m) flag=1;else add(i,j,a,b,-d[i][j]); // 将当前位置的值全部减去(区间减法)}}}}if(flag) cout<<"QAQ"<<endl;else cout<<"^_^"<<endl;return ;
}signed main(){ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);
#ifdef TDS_ACM_LOCALfreopen("D:\\VS code\\.vscode\\testall\\in.txt", "r", stdin);freopen("D:\\VS code\\.vscode\\testall\\out.txt", "w", stdout);
#endifint T;T=read();while(T--) solve();return 0;
}
2020ICPC·小米 网络选拔赛第一场(Matrix Subtraction (二维差分))相关推荐
- 2020ICPC·小米 网络选拔赛第一场 J.Matrix Subtraction
2020ICPC 小米 网络选拔赛第一场 J.Matrix Subtraction 题目链接 题目描述 Given a matrix MM_{}M of size n×mn\times mn×m a ...
- 2020ICPC·小米 网络选拔赛第一场 D.Router Mesh
2020ICPC·小米 网络选拔赛第一场 D.Router Mesh 题目链接 题目描述 In a Mesh networking system, there are nn_{}n MI Route ...
- 2020ICPC·小米 网络选拔赛第一场
比赛链接 前言 第二场都快打了才补完题目发博客,最近事情真的太多了= = A - Intelligent Warehouse(DP+数论优化),三种做法 题目大意 给出 n n n个数,从中选择最多的 ...
- 2020ICPC·小米 网络选拔赛第一场 全部题解
整理的算法模板合集: ACM模板 目录 题目传送门 题目总体情况 A.Intelligent Warehouse B.Intelligent Robot C.Smart Browser D.Route ...
- 2020ICPC·小米 网络选拔赛第一场(D. Router Mesh)
题意: 模板题,求图中每个割点能把网络分成几个点双连通分量(不是割点就输出他有几块即可). 题解: 跟POJ 的SPF很像 这题用Tarjan来求,首先我们需要统计出来具体有几个连通块. 对于每个连通 ...
- acm-(推式子、好题、数学、排列计数)2020ICPC·小米 网络选拔赛第一场 H.Grouping
传送门 先将aia_iai从小到大排序. 然后这里有一些符号约定: ggg表示一个分组, wg=∣ai−aj∣w_g=|a_i-a_j|wg=∣ai−aj∣表示某个组ggg的权值, GGG表示 ...
- 2020ICPC·小米 网络选拔赛第一场 Intelligent Warehouse(DP)
题意: n个数,要求取得最多的数,使得任意两个数其中一个为另一个倍数. 思路: 则定义dp[i]dp[i]dp[i]为第i个数为取出序列数中最大数时,最多取多少数. 则dp[i]dp[i]dp[i]向 ...
- ICPC2020小米网络选拔赛第一场复盘
1.看题 第一次组队打ICPC,可能任务分配上还有待优化 但是有个团队,感觉安心好多. 我们有三个人,开始是分开来,每人看三题 djn看ABC,jyf看DEF,我看GHI,JK没人看 我开始只来得及看 ...
- 2020ICPC 小米 网络选拔赛第二场
比赛链接 D - Determinant(行列式化简) 题目大意 给出行列式Mij={aibji≠jaibj+xi=jM_{ij} = \left\{\begin{array}{rcl} a_ib_j ...
最新文章
- Turbo Intruder 使用 - 拥抱十亿请求攻击
- cpu飙升 死循环_java排查一个线上死循环cpu暴涨的过程分析
- 替换元素节点replaceChild()
- 对中级 Linux 用户有用的 20 个命令
- 【HTML+CSS网页设计与布局 从入门到精通】第14章-float/position/display属性
- sose会议级别_【2017年整理】计算机领域EI和SCI收录期刊、影响因子及国际会议.doc...
- 从零开始搭建EasyDarwin环境——git的安装下载及拉取EasyDarwin代码运行
- 2022年中国数字孪生城市市场分析:孪生城市产业经济全域协作
- gmail注册方法_如何在Gmail中释放空间:5种回收空间的方法
- mysql面试题50
- 图片加水印怎么加?教你一个好操作的办法
- 概率论在实际生活的例子_日常生活中的概率统计
- YYLabel和YYTextView的使用
- 我的小游戏开发之路|腾讯TGideas周桂华(花叔)
- w10电脑c盘满了怎么清理_w10电脑自动更新安装完c盘满了怎么清理
- 超声波传感器(CH101ch201) - Ⅱ
- [杂言] GoodBye,2016
- ST7701芯片820*320屏幕移植stemwin
- R语言 forestplot 包画森林图
- react:hash_亲爱的React:感谢信