关于二维数组的一点小技巧

关于遍历二维数组会出现超时的问题
在直接遍历二维数组会超时的情况下,蒟蒻学到的一个小技巧,利用一维数组进行模拟,具体操作可看例题

例 十字阵列问题
题目描述

小 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 取模的结果即可

输入

  1. 5 5 5
  2. 1 1 1
  3. 2 2 2
  4. 3 3 3
  5. 4 4 4
  6. 5 5 5

输出

  1. 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值