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;
}