2020ICPC·小米 网络选拔赛第一场 J.Matrix Subtraction (贪心,二维差分)
2024-08-31 15:47:23
题意:给一个\(nXm\)的矩阵,可以选取\(aXb\)的子矩阵,使子矩阵中的所有元素减一,问最后是否能使矩阵中所有元素变为\(0\).
题解:首先贪心,我们看最左上角的元素,如果\(g[1][1]\ge0\),那么我们就要对其子矩阵的所有元素减去\(g[1][1]\),然后因为\(g[1][1]\)已经是\(0\)了,假如\(g[1][2]\)存在的话,我们就只能让它成为子矩阵的左上角然后再对所有子矩阵减去\(g[1][2]\),以此类推,但是直接暴力的话复杂度会炸,我们需要用数据结构来维护,直接用二维差分即可,每次枚举到某个元素的时候判断它是否不小于\(0\),如果不是就不合法.
代码:
int t;
int n,m,a,b;
int g[1010][1010];
int p[1010][1010]; void updata(int i,int j,int ii,int jj,int c){
p[i][j]+=c;
p[ii+1][j]-=c;
p[i][jj+1]-=c;
p[ii+1][jj+1]+=c;
} void solve(){
n=read(),m=read(),a=read(),b=read();
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
g[i][j]=read();
p[i][j]=g[i][j]-g[i-1][j]-g[i][j-1]+g[i-1][j-1];
}
} for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
p[i][j]=p[i][j]+p[i-1][j]+p[i][j-1]-p[i-1][j-1];
if(p[i][j]<0){
puts("QAQ");
return;
}
else if(p[i][j]>0){
if(i+a-1>n || j+b-1>m){
puts("QAQ");
return;
}
else updata(i,j,i+a-1,j+b-1,-p[i][j]);
}
}
}
puts("^_^");
} int main() {
//ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
t=read();
while(t--){
solve();
}
return 0;
}
最新文章
- UIApplication
- 如何在IamgeButton上面添加文字
- SVN 服务启动报错 0x8007042a
- 微软正式发布Visual Studio 2013 Update 3 (2013.3) RTM
- Android入门(六)碎片
- python一
- JavaScript String 对象
- 内存的分配VS回收&;构造函数VS析构函数
- gvim-ide plugins
- Linux下安装loadrunner步骤及遇到的问题
- 各种文件的ContentType
- iOS 程序间跳转传参(支付和地图)
- VB6文件操作自定义函数合集之一
- kubernetes进阶之四:Label和Label Selector
- Want To Say Something
- Web浏览器与Web服务器之间的通信过程
- ob_start用法详解
- Markdown基本使用方法
- jQuery Ajax方式上传文件实现暂停或取消上传
- UI控件篇——UIPageControl及其自定义
热门文章
- CTFshow-萌新赛杂项_签到
- druid discard long time none received connection问题解析
- the7主题 一个强大的wordpress 主题 html5拖拽式建站系统
- php artisan db:seed 报错
- The Go Blog Getting to Go: The Journey of Go&#39;s Garbage Collector
- okhttp踩坑
- ubuntu中如何安装selenium+chrome(headless)无界面浏览器?
- Java 实现Redis客户端,服务端
- Golang之垃圾回收
- MySQL 数据库性能调优