2020牛客寒假算法基础集训营6—F 十字阵列

超链:https://ac.nowcoder.com/acm/contest/3007/F

题目描述
小 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
1 1 1
2 2 2
3 3 3
4 4 4
5 5 5
输出
复制
890
说明
造成伤害的情况是:
1 3 4 5 6
3 2 5 6 7
4 5 3 7 8
5 6 7 4 9
6 7 8 9 5
补充的说明:
890 = 1*(1+1)+3*(1+2)+4*(1+3)+…+5*(5+5),一共25项累加得到890

思路:

这道题很就简单,但是我做的时候数据看错了,把矩阵的规模多看了一个0;所以数组开不了那么大,我就用map+pair来记录;结果如愿以偿地T;因为mp复杂度太高,题目有50万组输入;其实很简单,用二维数组就可以了;

设3个数组a[],b[]和ab[][],分别统计对行,列和每格造成的伤害
进行操作(xi,yi,zi)时,a[xi],b[yi],ab[xi][yi]都加上zi
每次询问一格的答案时,只要查询a[x]+b[y]-ab[x][y]就好了

时间复杂度 O(h+n*m);

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
 
using namespace std;
const int N = 2010;
const int mod = 1000000007;
 
int x[N], y[N], xy[N][N], n, m, H, ans; 
int main()
{
    int i, j, k, h;
    scanf("%d%d%d", &n, &m, &H);
    for(i = 1; i <= H; i ++){
        scanf("%d%d%d", &j, &k, &h);
        x[j] += h, y[k] += h, xy[j][k] += h;
    }
    for(i = 1; i <= n; i ++)
        for(j = 1; j <= m; j ++)
            ans = (ans + (long long)(x[i] + y[j] - xy[i][j]) * (i + j) % mod) % mod;
    printf("%d", (ans + mod) % mod);
     
    return 0;
}

.
.
但是不巧的是我看错了数据,于是我找到了一个更为简单的写法;就是在输入的时候就计算;
根据乘法分配律结合律的知识,完全可以这样做;每次输入都把加权后的结果算出来;这一列这一行总共增加多少;

时间复杂度:O(h)

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=1e9+7;
ll mpx[20005],mpy[2005];
map<pair<ll,ll>, ll >mp;
int main()
{
    ll n,m,h;
    scanf("%lld %lld %lld",&n,&m,&h);
    ll ans=0;
    while(h--)
    {
        ll x,y,z;
        scanf("%lld %lld %lld",&x,&y,&z);
        ans+=z*((m*x+n*(n+1)/2)%mod+(n*y+m*(m+1)/2%mod)-x-y)%mod;
    }
    cout <<ans%mod<<endl;
}
发布了199 篇原创文章 · 获赞 36 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43872728/article/details/104333447
今日推荐