[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; }
相关文章推荐
- [HackerRank 101 Hack 51] Small Cubes
- [HackerRank 101 Hack 51] Train Trip
- Python HackerRank|The Minion Game
- Hackerrank 101 Hack 42 Array Pairs
- [线段树][单调栈]HackerRank 101 Hack 50 .Boxes for Toys
- [线段树 || 主席树][Hash] HackerRank 101 Hack 49. Sorting Lists
- [HackerRank 101 Hack 42]Array Pairs
- [Hackerrank 101 Hack 43&& MenciOJ P321] K-Inversion Permutations
- hackthegame<第六关>
- Hackerrank - Coin on the Table 题解
- (黑客游戏)HackTheGame1.21 过关攻略
- 文章标题 HackerRank - mehta-and-the-typical-supermarket (容斥原理)
- HackerRank "Nimble Game"
- Hack The Game 通关记录
- HackerRank "Permutation game"
- hackthegame<第七关>
- HackerRank - journey-to-the-moon 【并查集】
- HackerRank - The Maximum Subarray
- HackerRank "The Great XOR"
- hackthegame<第八关>