[HackerRank 101 Hack 51] Testing the Game

题意

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 
. # . # . # . # . # . # . # . # . # . # . # . # . # . # . # . # . 
. # . # . # . # . # . # . # . # . # . # . # . # . # . # . # . # . 
. # . # . # . # . # . # . # . # . # . # . # . # . # . # . # . # . 
. # . # . # . # . # . # . # . # . # . # . # . # . # . # . # . # . 
. # . # . # . # . # . # . # . # . # . # . # . # . # . # . # . # . 
. # . # . # . # . # . # . # . # . # . # . # . # . # . # . # . # . 
. # . # . # . # . # . # . # . # . # . # . # . # . # . # . # . # . 
. # . # . # . # . # . # . # t # . # . # . # . # . # . # . # . # . 
. # . # . # . # . # . # . # . # . # . # . # . # . # . # . # . # . 
. # . # . # . # . # . # . # . # . # . # . # . # . # . # . # . # . 
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 

如图 n 2m1列的网格,#表示格子为墙,.表示格子为空,t表示格子中有个人。t不会出现在第一行和第 n 行。
每次询问给出一个t numi,j 表示距离格子 (i,j) 距离不超过 t 的人有多少,求

i=2n1j=12m1(ijnum2i,j)mod109+7

n,m1000,t5000,q20

题解

对于一个询问给定的 t ,枚举所有的格子,如果每个格子答案可以O(1)计算出来总复杂度就是 O(nmq) 的了。
那么如何统计到达一个格子距离不超过 t 的人数呢?距离一个格子不超过t的点标记出来,如下

. . . . . . 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 . . . . . . . . . .
. # . # . # . # 1 # 1 # 1 # 1 # 1 # 1 # 1 # . # . # . # . # . # .
. # . # . # . # 1 # 1 # 1 # 1 # 1 # 1 # 1 # . # . # . # . # . # .
. # . # . # . # . # 1 # 1 # 1 # 1 # 1 # . # . # . # . # . # . # .
. # . # . # . # 1 # 1 # 1 # 1 # 1 # 1 # 1 # . # . # . # . # . # .
. # . # . # . # 1 # 1 # 1 # 1 # 1 # 1 # 1 # . # . # . # . # . # .
. # . # . # 1 # 1 # 1 # 1 # 1 # 1 # 1 # 1 # 1 # . # . # . # . # .
. # . # . # 1 # 1 # 1 # 1 # 1 # 1 # 1 # 1 # 1 # . # . # . # . # .
. # . # 1 # 1 # 1 # 1 # 1 # 1 # 1 # 1 # 1 # 1 # 1 # . # . # . # .
. # . # 1 # 1 # 1 # 1 # 1 # 1 # 1 # 1 # 1 # 1 # 1 # . # . # . # .
. # 1 # 1 # 1 # 1 # 1 # 1 # 1 # 1 # 1 # 1 # 1 # 1 # 1 # . # . # .
. 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 . . . . .

把墙去掉后如下

. . . . . . 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 . . . . . . . . . .
. . . . . . . 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 . . . . . . . . . . .
. . . . . . . . 1 1 1 1 1 1 1 1 1 1 1 1 1 . . . . . . . . . . . .
. . . . . . . . . 1 1 1 1 1 1 1 1 1 1 1 . . . . . . . . . . . . .
. . . . . . . . 1 1 1 1 1 1 1 1 1 1 1 1 1 . . . . . . . . . . . .
. . . . . . . 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 . . . . . . . . . . .
. . . . . . 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 . . . . . . . . . .
. . . . . 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 . . . . . . . . .
. . . . 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 . . . . . . . .
. . . 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 . . . . . . .
. . 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 . . . . . .
. 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 . . . . .

那么答案可以分为五部分

. . . . . . 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 . . . . . . . . . .
. . . . . . . 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 . . . . . . . . . . .
. . . . . . . . 1 1 1 1 1 1 1 1 1 1 1 1 1 . . . . . . . . . . . .
. . . . . . . . . 1 1 1 1 1 1 1 1 1 1 1 . . . . . . . . . . . . .
. . . . . . . . 1 1 1 1 1 1 1 1 1 1 1 1 1 . . . . . . . . . . . .
. . . . . . . 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 . . . . . . . . . . .
. . . . . . 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 . . . . . . . . . .
. . . . . 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 . . . . . . . . .
. . . . 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 . . . . . . . .
. . . 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 . . . . . . .
. . 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 . . . . . .
. 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 . . . . .

=

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . 1 . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . 1 1 . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . 1 1 1 . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . 1 1 1 1 . . . . . . . . . . . . . . . . . . . . . . . .
. . . . 1 1 1 1 1 . . . . . . . . . . . . . . . . . . . . . . . .
. . . 1 1 1 1 1 1 . . . . . . . . . . . . . . . . . . . . . . . .
. . 1 1 1 1 1 1 1 . . . . . . . . . . . . . . . . . . . . . . . .
. 1 1 1 1 1 1 1 1 . . . . . . . . . . . . . . . . . . . . . . . .
  • +
. . . . . . 1 1 1 . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . 1 1 . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . 1 . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

+

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . 1 . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . 1 1 . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . 1 1 1 . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . 1 1 1 1 . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . 1 1 1 1 1 . . . . . . . .
. . . . . . . . . . . . . . . . . . . . 1 1 1 1 1 1 . . . . . . .
. . . . . . . . . . . . . . . . . . . . 1 1 1 1 1 1 1 . . . . . .
. . . . . . . . . . . . . . . . . . . . 1 1 1 1 1 1 1 1 . . . . .

+

. . . . . . . . . . . . . . . . . . . . 1 1 1 . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . 1 1 . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . 1 . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

+

. . . . . . . . . 1 1 1 1 1 1 1 1 1 1 1 . . . . . . . . . . . . .
. . . . . . . . . 1 1 1 1 1 1 1 1 1 1 1 . . . . . . . . . . . . .
. . . . . . . . . 1 1 1 1 1 1 1 1 1 1 1 . . . . . . . . . . . . .
. . . . . . . . . 1 1 1 1 1 1 1 1 1 1 1 . . . . . . . . . . . . .
. . . . . . . . . 1 1 1 1 1 1 1 1 1 1 1 . . . . . . . . . . . . .
. . . . . . . . . 1 1 1 1 1 1 1 1 1 1 1 . . . . . . . . . . . . .
. . . . . . . . . 1 1 1 1 1 1 1 1 1 1 1 . . . . . . . . . . . . .
. . . . . . . . . 1 1 1 1 1 1 1 1 1 1 1 . . . . . . . . . . . . .
. . . . . . . . . 1 1 1 1 1 1 1 1 1 1 1 . . . . . . . . . . . . .
. . . . . . . . . 1 1 1 1 1 1 1 1 1 1 1 . . . . . . . . . . . . .
. . . . . . . . . 1 1 1 1 1 1 1 1 1 1 1 . . . . . . . . . . . . .
. . . . . . . . . 1 1 1 1 1 1 1 1 1 1 1 . . . . . . . . . . . . .

第五部分非常好统计,剩下的四个三角形可以用 O(nm) 的前缀和求得,非常简单。
这道题没有将第一行与第n行的格子也加入到答案统计中算是比较良心了(才不会说忘了这个条件把首尾两行的格子也统计了呢

代码

/// by ztx
/// blog.csdn.net/hzoi_ztx
#include <bits/stdc++.h>
#define Rep(i,l,r) for(i=(l);i<=(r);i++)
#define rep(i,l,r) for(i=(l);i< (r);i++)
#define Rev(i,r,l) for(i=(r);i>=(l);i--)
#define rev(i,r,l) for(i=(r);i> (l);i--)
#define Each(i,v)  for(i=v.begin();i!=v.end();i++)
// #define r(x)   read(x)
typedef long long ll ;
typedef double lf ;
int CH , NEG ;
template <typename TP>inline void read(TP& ret) {
    ret = NEG = 0 ; while (CH=getchar() , CH<'!') ;
    if (CH == '-') NEG = true , CH = getchar() ;
    while (ret = ret*10+CH-'0' , CH=getchar() , CH>'!') ;
    if (NEG) ret = -ret ;
}
template <typename TP>inline void readc(TP& ret) {
    while (ret=getchar() , ret<'!') ;
    //while (CH=getchar() , CH>'!') ;
}

#define  kN  1024LL
#define  kM  2048LL
#define  mod  1000000007LL

int n, m, K;
char s[kN][kM];
int col[kN][kM], ru[kN][kM], rd[kN][kM], lu[kN][kM], ld[kN][kM], row_mid[kM];

inline void Add(int&a,const int&b) {a+=b;if(a>=mod)a-=mod;}

inline int Calc(int r,int c,int t) {
    int ret = 0, t1, t2, t3, t4;
        if (t < n+1) {
            t1 = std::max(r-t,2), t2 = std::min(r+t,n-1);
            if (t1 <= t2) ret += col[t2][c]-col[t1-1][c];
            t1 = t-r, t2 = 2*n-t-r+2;
            if (c > 1) {
                if (t1 > 1) ret += lu[t1][c-2];
                if (t2 < n) ret += ld[t2][c-2];
            }
            if (c < m) {
                if (t1 > 1) ret += ru[t1][c+2];
                if (t2 < n) ret += rd[t2][c+2];
            }
        } else {
            t1 = (t-n+1)/2;
            t2 = std::max(c-t1*2,1), t3 = std::min(c+t1*2,m);
            ret += row_mid[t3]-row_mid[t2-1];
            t4 = n-1+(t1+1)*2-t;
            t2 = c-t1*2, t3 = c+t1*2;
            if (t2 > 1) {
                if (n+1-r-t4 > 1)
                    ret += lu[n+1-r-t4][t2-2];
                if (n+1-r+t4 < n)
                    ret += ld[n+1-r+t4][t2-2];
            }
            if (t3 < m) {
                if (n+1-r-t4 > 1)
                    ret += ru[n+1-r-t4][t3+2];
                if (n+1-r+t4 < n)
                    ret += rd[n+1-r+t4][t3+2];
            }
        }
    ret = 1LL*ret*ret%mod*r*c%mod;
    return ret;
}

inline int Query(int t) {
    int r, c, ret = 0;
    Rep (r,2,n-1) Rep (c,1,m) if (s[r][c]!='#') Add(ret,Calc(r,c,t));
    return ret;
}

int main() {
    int r, c, K, q, t;
    read(n), read(K);
    m = K*2-1;
    Rep (r,1,n) Rep (c,1,m) {
        readc(s[r][c]);
        if (s[r][c] == 't') {
            ru[r][c] = rd[r][c] = lu[r][c] = ld[r][c] = col[r][c] = 1;
        }
    }
    Rep (c,1,m) if (c&1) {
        Rep (r,3,n-1) col[r][c] = (lu[r][c] += lu[r-1][c]), ru[r][c] += ru[r-1][c];
        Rev (r,n-2,2) ld[r][c] += ld[r+1][c], rd[r][c] += rd[r+1][c];
    }
    Rep (c,3,m) if (c&1)
        Rep (r,2,n-1) {
            if (r-2 > 1) lu[r][c] += lu[r-2][c-2];
            if (r+2 < n) ld[r][c] += ld[r+2][c-2];
        }
    Rev (c,m-2,1) if (c&1)
        Rep (r,2,n-1) {
            if (r-2 > 1) ru[r][c] += ru[r-2][c+2];
            if (r+2 < n) rd[r][c] += rd[r+2][c+2];
        }
    Rep (c,1,m)
        row_mid[c] = col[n-1][c], row_mid[c] += row_mid[c-1];
    read(q);
    while (q --> 0)
        read(t), printf("%d\n", Query(t));
    END: getchar(), getchar();
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值