2020ICPC·小米 网络选拔赛第一场(Matrix Subtraction (二维差分))
生活随笔
收集整理的這篇文章主要介紹了
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 (二维差分))的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mybatis-plus在Mapper类
- 下一篇: 零碎知识——业务