您的位置:首页 > 其它

[HackerRank 101 Hack 51] Testing the Game

2017-08-14 16:56 555 查看

题意

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


如图n行2m−1列的网格,
#
表示格子为墙,
.
表示格子为空,
t
表示格子中有个人。
t
不会出现在第一行和第n行。

每次询问给出一个t,numi,j表示距离格子(i,j)距离不超过t的人有多少,求∑i=2n−1∑j=12m−1(i⋅j⋅num2i,j)mod109+7

n,m≤1000,t≤5000,q≤20

题解

对于一个询问给定的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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: