C. OLED(二维差分)

C. OLED(二维差分)

思路:统计每个发光像素在屏幕上的贡献,可以观察可得这个贡献是一个区间的形式,所以考虑用二维差分代表区间加,然后求前缀和即可得每个点出现的次数。

传送门

#include<bits/stdc++.h>
using namespace std;
const int N=4e3+5;
int dif[N][N],n,m,a,b;
int main(){
	scanf("%d%d%d%d",&n,&m,&a,&b);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++){
			int x;
			scanf("%d",&x);if(!x) continue;
			int r=a-n+i,c=b-m+j;
			dif[i][j]++;
			dif[i][c+1]--;
			dif[r+1][j]--;
			dif[r+1][c+1]++;
		}
	int mx=0;
	for(int i=1;i<=a;i++)
		for(int j=1;j<=b;j++){
			dif[i][j]+=dif[i-1][j]+dif[i][j-1]-dif[i-1][j-1];
			mx=max(mx,dif[i][j]);
		}
	for(int i=1;i<=a;i++){
		for(int j=1;j<=b;j++){
			printf("%d ",100*dif[i][j]/mx);
		}
		puts("");
	}
	return 0; 
}

猜你喜欢

转载自blog.csdn.net/weixin_45750972/article/details/107425104