命题人:四毛拽根
知识点:二维前缀和
难度:中等
时间限制:1000ms
内存限制:65536KiB
天崩地裂【R】
Description
“银龙重铸之日,骑士归来之时!我们是冠军!”
11月7日凌晨,中国战队EDG3:2战胜韩国战队DK夺得2021英雄联盟全球总决赛冠军。EDG终于不负众望,时隔多年梦不减,用实力证明了自己,也圆了老粉的一个梦。
在决赛的第一轮中,EDG打野jiejie的皇子敢于冲锋,有勇有谋,表现可谓完美。
皇子的大招叫做天崩地裂,会在目标周围形成环形障碍,是开团的好技能。
被热情感染的小z也想玩皇子,但是小z是新手召唤师,不懂得在哪里释放皇子的大招比较好。所以找到了会编程的你。
为了简化问题,我们假设皇子的大招是一个范围为
10
∗
10
10 * 10
10∗10的方形。现在给出一块
n
∗
m
n * m
n∗m 的地图,地图上面有敌方小兵,也有敌方英雄。若小兵被大招命中可以获得1分,若敌方英雄被命中可以获得3分(在方形范围内就算命中,边界也算。注意在本题中敌方英雄不仅仅有5个,并且技能的范围不能越出地图)。现在请你告诉小z可获得的最高分数,和在哪个位置释放技能可以得到最高的分数。如果有多个最高分数的位置,请输出最靠左上的位置。其中,我们用方形的右下角所在的行和列表示技能的位置。
(最靠左上的位置:先将符合的每个位置所在的行号从小到大排序,若有相同的行,再按所在的列号从小到大排序,答案就是排序完的第一个位置)
Input
首先输入两个正整数
n
n
n ,
m
m
m (
10
≤
n
≤
3000
10 \leq n \leq 3000
10≤n≤3000 ,
10
≤
m
≤
3000
10 \leq m \leq 3000
10≤m≤3000 ),表示地图的大小。
接下来输出
n
n
n 行,
m
m
m 列的字符矩阵。
(‘ . ’表示空地,‘ * ’表示敌方小兵的位置,‘ # ’表示敌方英雄的位置)
Output
如果该地图中没有小兵和英雄,就输出“gg”。
否则,在第一行输出可获得的最大分数。
在第二行输出两个用空格隔开的整数
x
x
x ,
y
y
y (
1
≤
x
≤
n
1 \leq x \leq n
1≤x≤n ,
1
≤
y
≤
m
1 \leq y \leq m
1≤y≤m )来表示释放技能的位置。
Sample
Input 1
15 15
....##.........
...........#...
...............
...............
...............
..............*
....#.....*....
...............
...............
..........#....
.........*.....
..........*....
.*.............
.........*.#...
...............
Output 1
16
10 12
Input 2
18 19
#.##**.#...........
#.*....*....*#..#.#
*..**#..**.#...#*.#
*....*...#*...#....
**#*##.....*##.*.**
.#.*.#*#...*...#..#
.*.........#.....#.
.......**.##*.*....
**.....##.**......#
...*#*#.#*#**.*..**
**....*##....##.**#
*###...***.#**.**..
*.#*#...*.*#..*..*.
..#..*....*#.#..*..
.#...#....*#.*.#.*.
...*.....##.#.#*...
##....**#*#..##..#*
.....*..##....**..*
Output 2
102
17 15
Hint
code
#include <bits/stdc++.h>
using namespace std;
const int N = 3010;
int n, m;
int s[N][N];
int main() {
// freopen("data1.in", "r", stdin);
// freopen("data1.out", "w", stdout);
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) {
getchar();
for (int j = 1; j <= m; j++) {
char op;
scanf("%c", &op);
if (op == '*')
s[i][j] = 1;
else if (op == '#')
s[i][j] = 3;
s[i][j] += s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1];
}
}
int res_x = 0, res_y = 0, res = 0;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
int x = i - 10, y = j - 10;
if (x < 0 || y < 0) continue;
int temp = s[i][j] - s[i][y] - s[x][j] + s[x][y];
if (res < temp) {
res = temp;
res_x = i, res_y = j;
}
}
}
if (res == 0)
puts("gg");
else {
printf("%d\n", res);
printf("%d %d\n", res_x, res_y);
}
return 0;
}