题目描述:
链接:https://ac.nowcoder.com/acm/problem/53676
来源:牛客网
帕秋莉掌握了一种土属性魔法
这种魔法可以在一片k×k大小的一个正方形区域内产生地震
但是如果某片即将产生地震的区域内有建筑物,帕秋莉会停止施法
整个地图大小为n×m,其中一些地方有建筑
请问有多少种可能的情况,使得帕秋莉会停止施法
具体思路
二维前缀和上线啦~
求前缀和后判断k*k地震范围中有无建筑物,如有,ans++.
看到这里的你,
是否脑海中依稀残存着某个身影,
用着轻柔的声音,
轻轻提醒着你,
是否有那么一道题,
窝在你的题库中静静看着你,
没错,少年郎,你是否遇见过激光炸弹【以上可以当作废话处理】
- 一个虚假的科普
我曾经为激光炸弹绘过一幅图
我决定把它放上来/* ________________________________ | | | | | | | | | | | | | | | |_______________|________________| | | | | | | | | 这一块 —— |——f[i][j]-f[i-r][j]-f[i][j-r]+f[i-r][j-r] | | | | | | | | | |_______________|________________| f[i][j]
简陋的字符画
代表着当初我犯的***r>这幅画
可能会使我被愤怒的老师暗杀
毕竟好好的题解
不可能如此浮夸【doge】
不过没关系,根据这幅画我们不难看出,想要得知矩阵内kk正方形的前缀和,只需要用f[i][j]-f[i-k][j]-f[i][j-k]+f[i-k][j-k]
*正方形前缀和=囊括该正方形的以大矩阵左上角为起点的最小矩阵的前缀和-左边的一块-上面的一块+两块中间重复的部分**
看!文字解释完更混乱了呢!【建议画图尝试!!!】
不过这也没关系
我们上代码:
#include<bits/stdc++.h> using namespace std; char AC; int f[1005][1005],ans_[1005][1005]; int ans=0,n,m,r; int main() { memset(f,0,sizeof(f)); scanf("%d%d%d", &n,&m,&r); if(r==0) { printf("0\n"); return 0; } for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ cin>>AC; ans_[i][j]=AC-'0'; } } for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { f[i][j]=ans_[i][j]+f[i][j]+f[i-1][j]+f[i][j-1]-f[i-1][j-1];//求前缀和 } } for(int i=r;i<=n;i++) { for(int j=r;j<=m;j++) { if(f[i][j]-f[i-r][j]-f[i][j-r]+f[i-r][j-r]) {//如果这一块地的前缀和不为0,说明有建筑,ans++ ans++; } } } printf("%d\n", ans); return 0; }
看到这里
不知各位少年郎是否依旧懵逼
但没有关系
WA并不会让大脑死机
题解暂且就到这里
2.18打卡依旧给力(并未)
不论如何明日推题再会
bye!