关于遍历二维数组会出现超时的问题
在直接遍历二维数组会超时的情况下,蒟蒻学到的一个小技巧,利用一维数组进行模拟,具体操作可看例题
例 十字阵列问题
题目描述
小 Q 新学会了一种魔法,可以对一个 N行M列 的网格上的敌人造成伤害 第 i 次使用魔法可以对网格上的一个十字形区域(即第 xi 行和第
yi 列的并)中的每个格子上的敌人造成 zi 点伤害 现在小 Q 一共使用了 H
次魔法,你需要在所有的施法完成之后统计造成伤害的情况,详见输出描述 提醒:本题输入规模较大,请使用高效的输入方式 1≤H≤500,000
1≤xi,yi,zi,N,M≤2000 1≤xi≤N,1≤yi≤M
输入描述:
第一行 3 个数字 N,M,H 接下来 H 行,每行 3 个正整数 xi,yi,zi
输出描述:
为了避免大量的输出,假设第 i 行第 j 列受到的总伤害是 wij 你只需要输出Σwij(i+j)对 10^9+7 取模的结果即可
输入
- 5 5 5
- 1 1 1
- 2 2 2
- 3 3 3
- 4 4 4
- 5 5 5
输出
- 890
本题第一眼想法(我)可能是每一次伤害都对二维数组进行操作,但最后会导致TLE,此时一种解法,设置三个数组,x[],y[],a[][] 用来操作,对应数组的值就是 x[i]+y[j]-a[i][j]
#include <bits/stdc++.h>
using namespace std;
const int modd=1e9+7;
int x[2001],y[2001];
int mapp[2001][2001];
int main()
{
int n,m,h;
int a,b,c;
int ans=0;
cin>>n>>m>>h;
for(int i=0;i<h;i++)
{
scanf("%d%d%d",&a,&b,&c);
x[a]+=c;
y[b]+=c;
mapp[a][b]+=c;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
ans=(ans+(long long)(x[i]+y[j]-mapp[i][j])*(i+j))%modd;
}
}
cout<<ans;
return 0;
}