题解 | #时不时使使用玉米加农炮掩饰害羞的邻座艾莉同学#
时不时使使用玉米加农炮掩饰害羞的邻座艾莉同学
https://ac.nowcoder.com/acm/contest/120564/H
H题
由题意得,在每次增援后,都需要找出一个点,使距离他的曼哈顿距离不超过2的13个点之和最大(包括该点在内),每一次增援只会影响到该增援的点在内的13个点,那么可以直接用一个二维数组直接记录某一个位置和他周围点的和,即直接记录使用玉米加农炮落在该点时消灭的敌人数量,一开始填充完数组之后,直接遍历一遍,找出最大值,并记录点坐标,在每次增援后都要让增援所影响的13个点都和最大值去比较,再次更新
#include <bits/stdc++.h>
using namespace std;
int dx[13]={0,0,1,2,0,0,-1,-2,1,1,-1,-1,0};
int dy[13]={1,2,0,0,-1,-2,0,0,1,-1,1,-1,0};
int main(){
int n,m,q;cin>>n>>m>>q;
long long a[520][520];
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
int a1;cin>>a1;
for(int k=0;k<13;k++){
if((i+dx[k])<1||(j+dy[k])<1) continue;
a[i+dx[k]][j+dy[k]]+=a1;
}
}
}
long long max=0;
int p1=0,p2=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(a[i][j]>max) {
max=a[i][j];
p1=i;p2=j;
}
}
}
while(q--){
int x,y,z;cin>>x>>y>>z;
for(int i=0;i<13;i++){
if((x+dx[i])<1||(y+dy[i])<1) continue;
a[x+dx[i]][y+dy[i]]+=z;
if(a[x+dx[i]][y+dy[i]]>max){
max=a[x+dx[i]][y+dy[i]];
p1=x+dx[i];p2=y+dy[i];
}
}
cout<<p1<<" "<<p2<<endl;
}
}
using namespace std;
int dx[13]={0,0,1,2,0,0,-1,-2,1,1,-1,-1,0};
int dy[13]={1,2,0,0,-1,-2,0,0,1,-1,1,-1,0};
int main(){
int n,m,q;cin>>n>>m>>q;
long long a[520][520];
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
int a1;cin>>a1;
for(int k=0;k<13;k++){
if((i+dx[k])<1||(j+dy[k])<1) continue;
a[i+dx[k]][j+dy[k]]+=a1;
}
}
}
long long max=0;
int p1=0,p2=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(a[i][j]>max) {
max=a[i][j];
p1=i;p2=j;
}
}
}
while(q--){
int x,y,z;cin>>x>>y>>z;
for(int i=0;i<13;i++){
if((x+dx[i])<1||(y+dy[i])<1) continue;
a[x+dx[i]][y+dy[i]]+=z;
if(a[x+dx[i]][y+dy[i]]>max){
max=a[x+dx[i]][y+dy[i]];
p1=x+dx[i];p2=y+dy[i];
}
}
cout<<p1<<" "<<p2<<endl;
}
}