【NOIP2016提高A组模拟9.21】矩阵

来源:互联网 发布:编程资料百度云 编辑:程序博客网 时间:2024/05/21 17:07

题目

看题目戳这里~(看不了的话就看下面吧不过少了一个图而且sample input很奇怪QAQ)

Description

在麦克雷的面前出现了一个有n*m个格子的矩阵,每个格子用“.”或“#”表示,“.”表示这个格子可以放东西,“#”则表示这个格子不能放东西。现在他拿着一条1*2大小的木棒,好奇的他想知道对于一些子矩阵,有多少种放木棒的方案。

Input

第一行包含 2 个正整数 n,m。
接下来 n 行每行包含 m 个字符“.”或“#”。
第n+1行包含1个正整数q,表示询问次数。
接下来q行每行包含4个正整数r1,c1,r2,c2,分别表示询问的子矩阵的左上格子和右下格子的位置。

Output

输出共 q 行,每行包含 1 个整数,表示该询问的方案数。

Sample Input

5 8
….#..#
.#……

.#….

..#.

……..
4
1 1 2 3
4 1 4 1
1 2 4 5
2 5 5 8

Sample Output

4
0
10
15
Data Constraint

30%:q<=100
100%:q<=10^5,1<=n,m<=500

比赛时の想法

设sum[i,j]为第i行前j个位置如果要横着摆有多少种情况
sum1[i,j]为第i行前j个位置如果要竖着摆有多少种情况(i在下面)
那么每一次直接前缀和统计答案就好了

贴代码

var    f,g:array[0..505,0..505]of longint;    s:array[0..505,0..505]of char;    i,j,k,l,n,m,r1,c1,r2,c2,ans,q:longint;begin  //  assign(input,'t2.in'); reset(input);  //  assign(output,'t2.out'); rewrite(output);    readln(n,m);    for i:=1 to n do    begin        for j:=1 to m do read(s[i,j]);        readln;    end;    for i:=1 to n do    begin        for j:=2 to m do        begin            f[i,j]:=f[i,j-1];            if (s[i,j]='.') and (s[i,j-1]='.') then inc(f[i,j]);        end;    end;    for i:=2 to n do    begin        for j:=1 to m do        begin            g[i,j]:=g[i,j-1];            if (s[i,j]='.') and (s[i-1,j]='.') then inc(g[i,j]);        end;    end;    readln(q);    for i:=1 to q do    begin        readln(r1,c1,r2,c2);        ans:=0;        for j:=r1 to r2 do            ans:=ans+f[j,c2]-f[j,c1];        for j:=r1+1 to r2 do            ans:=ans+g[j,c2]-g[j,c1-1];        writeln(ans);    end;  //  close(input); close(output);end.
0 0
原创粉丝点击