题意
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. # . # . # . # . # . # . # . # . # . # . # . # . # . # . # . # .
. # . # . # . # . # . # . # . # . # . # . # . # . # . # . # . # .
. # . # . # . # . # . # . # . # . # . # . # . # . # . # . # . # .
. # . # . # . # . # . # . # . # . # . # . # . # . # . # . # . # .
. # . # . # . # . # . # . # . # . # . # . # . # . # . # . # . # .
. # . # . # . # . # . # . # . # . # . # . # . # . # . # . # . # .
. # . # . # . # . # . # . # . # . # . # . # . # . # . # . # . # .
. # . # . # . # . # . # . # t # . # . # . # . # . # . # . # . # .
. # . # . # . # . # . # . # . # . # . # . # . # . # . # . # . # .
. # . # . # . # . # . # . # . # . # . # . # . # . # . # . # . # .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
如图
n
行#
表示格子为墙,.
表示格子为空,t
表示格子中有个人。t
不会出现在第一行和第
n
行。
每次询问给出一个
n,m≤1000,t≤5000,q≤20
题解
对于一个询问给定的
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;
}