1. 程式人生 > 實用技巧 >10-24 補題

10-24 補題

------------恢復內容開始------------

小米入圍賽J題

https://ac.nowcoder.com/acm/contest/7501/J

思路:二維差分

#include <bits/stdc++.h>

using namespace std;

int a[1100][1100], b[1100][1100]; 

int t, n, m, w, r;

void insert(int x1, int y1, int x2, int y2, int c){
	b[x1][y1] += c;
	b[x1][y2+1] -= c;
	b[x2+1][y1] -= c;
	b[x2+1][y2+1] += c;
}

int main()
{
	cin >> t;
	while(t--){    
		memset(b, 0, sizeof(b));
		cin >> n >> m >> w >> r;
		
		int sum = 0;
		for(int i = 1;i <= n; ++ i){
			for(int j = 1;j <= m; ++ j){
				cin >> a[i][j];
				insert(i, j, i, j, a[i][j]);
			} 
		}	
		for(int i = 1;i <= n - w + 1;i ++){
			for(int j = 1;j <= m - r + 1; j ++ ){
				if(b[i][j] > 0)
				insert(i, j, i + w - 1, j + r - 1, -b[i][j]);
			}
		}
		int flag = 1;
		for(int i = 1;i <= n; ++ i){
			for(int j = 1;j <= m; ++ j){
				if(b[i][j]) flag = 0;
			}
		}
		if(flag) puts("^_^");
		else puts("QAQ");
	}
}

  

------------恢復內容結束------------