问题 E: 小李打怪兽II
Posted iamcookieandyou
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了问题 E: 小李打怪兽II相关的知识,希望对你有一定的参考价值。
题目描述
在一个弱智游戏里,有m行n列的怪兽,每个怪兽用一个数值表示它的生命值。小李每次的攻击力都为k。
对于小李的每次攻击,给出三个整数x,y,r,表示对于以点(x−r,y−r)为左上角,点(x+r,y+r)为右下角的矩形范围内的怪兽生命值都减去k。怪兽生命值为0时就死了。请计算经过小李g轮的疯狂攻击,还剩几个怪兽存活。
对于小李的每次攻击,给出三个整数x,y,r,表示对于以点(x−r,y−r)为左上角,点(x+r,y+r)为右下角的矩形范围内的怪兽生命值都减去k。怪兽生命值为0时就死了。请计算经过小李g轮的疯狂攻击,还剩几个怪兽存活。
输入
第一行四个整数,分别表示m,n,k,g。
接下来g行整数,每行三个分别表示对应的x,y,r。
接下来是m行n列的正整数ai,j。
接下来g行整数,每行三个分别表示对应的x,y,r。
接下来是m行n列的正整数ai,j。
输出
一个整数,表示答案。
样例输入 Copy
6 5 2 1
4 3 2
3 2 1 2 5
1 2 4 1 1
3 3 3 1 2
4 43 1 1 5
5 2 2 2 4
1 1 3 1 5
样例输出 Copy
16
提示
对于100%的数据,1≤n,m,x,y,r≤1025,1≤k,a≤100,1≤g≤106
这题主要是用到了差分算法,简单的差分数组的应用
#include <cmath> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int N = 1050, M = 1e6 + 10; int m, n, k, g; int a[N][N], b[N][N]; int d[M][3]; //差分函数 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 >> m >> n >> k >> g; while (g -- ){ int x, y, r; cin >> x >> y >> r; insert(x - r, y - r, x + r, y + r, -k);//攻击,减去攻击范围内怪兽的生命值,k要输入负值 } for (int i = 1; i <= m; i ++ ) for (int j = 1; j <= n; j ++ ) cin >> a[i][j], insert(i, j, i, j, a[i][j]);//将怪兽生命值插进去 for (int i = 1; i <= m; i ++ ) for (int j = 1; j <= n; j ++ ) a[i][j] = a[i - 1][j] + a[i][j - 1] - a[i - 1][j - 1] + b[i][j]; int cnt = 0; for (int i = 1; i <= m; i ++ ){ for (int j = 1; j <= n; j ++ ){ if (a[i][j] > 0) cnt ++;//如果怪兽生命值大于零,怪兽活着,要计数 } } cout << cnt << endl; return 0; }
以上是关于问题 E: 小李打怪兽II的主要内容,如果未能解决你的问题,请参考以下文章