题目描述

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

输入

第一行包含 2 个正整数 n,m。

接下来 n 行每行包含 m 个字符“.”或“#”。

第n+1行包含1个正整数q,表示询问次数。

接下来q行每行包含4个正整数r1,c1,r2,c2,分别表示询问的子矩阵的左上格子和右下格子的位置。

输出

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

样例输入

5 8

….#..#

.#……

##.#….

##..#.##

……..

4

1 1 2 3

4 1 4 1

1 2 4 5

2 5 5 8

样例输出

4

0

10

15

数据范围

30%:q<=100

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

样例解释

解法

把原问题转化为规定矩阵中有多少对相邻的“.”。

简单的前缀和问题。

代码

#include<iostream>
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
#define ll long long
#define ln(x,y) int(log(x)/log(y))
#define sqr(x) ((x)*(x))
using namespace std;
const char* fin="aP2.in";
const char* fout="aP2.out";
const int inf=0x7fffffff;
const int maxn=507;
int n,m,i,j,k,l,o,ans;
char a[maxn][maxn];
int c[maxn][maxn][4],sum[maxn][maxn][7],d[maxn][maxn][4];
bool judge(int x,int y){
return x>0 && x<=n && y>0 && y<=m && a[x][y]=='.';
}
int getsum(int sx,int sy,int tx,int ty,int kind){
if (tx<sx || ty<sy) return 0;
return sum[tx][ty][kind]-sum[sx-1][ty][kind]-sum[tx][sy-1][kind]+sum[sx-1][sy-1][kind];
}
int main(){
scanf("%d%d",&n,&m);
for (i=1;i<=n;i++) scanf("%s",a[i]+1);
for (i=1;i<=n;i++) for (j=1;j<=m;j++){
if (judge(i,j)){
if (judge(i+1,j)){
c[i][j][0]++;
c[i][j][1]++;
sum[i][j][0]++;
sum[i][j][1]++;
sum[i][j][3]++;
sum[i][j][4]++;
sum[i][j][5]++;
d[i][j][0]++;
}
if (judge(i,j+1)){
c[i][j][0]++;
c[i][j][3]++;
sum[i][j][0]++;
sum[i][j][2]++;
sum[i][j][3]++;
sum[i][j][4]++;
sum[i][j][6]++;
d[i][j][3]++;
}
if (judge(i-1,j)){
c[i][j][2]++;
c[i][j][3]++;
sum[i][j][1]++;
sum[i][j][2]++;
sum[i][j][3]++;
sum[i][j][4]++;
sum[i][j][5]++;
d[i][j][2]++;
}
if (judge(i,j-1)){
c[i][j][1]++;
c[i][j][2]++;
sum[i][j][0]++;
sum[i][j][1]++;
sum[i][j][2]++;
sum[i][j][4]++;
sum[i][j][6]++;
d[i][j][1]++;
}
}
for (k=0;k<7;k++) sum[i][j][k]+=sum[i-1][j][k]+sum[i][j-1][k]-sum[i-1][j-1][k];
}
scanf("%d",&i);
for (;i;i--){
scanf("%d%d%d%d",&j,&k,&l,&o);
if (j==l && k==o) ans=0;
else
if (j==l){
ans=getsum(j,k+1,j,o-1,6)+d[j][k][3]+d[j][o][1];
}else if (k==o) ans=getsum(j+1,o,l-1,o,5)+d[j][o][0]+d[l][o][2];
else {
ans=getsum(j+1,k+1,l-1,o-1,4)+c[j][k][0]+c[j][o][1]+c[l][k][3]+c[l][o][2];
ans+=getsum(j,k+1,j,o-1,0)+getsum(l,k+1,l,o-1,2);
ans+=getsum(j+1,o,l-1,o,1)+getsum(j+1,k,l-1,k,3);
}
ans/=2;
printf("%d\n",ans);
}
return 0;
}

启发

注意边界。

【JZOJ4791】【NOIP2016提高A组模拟9.21】矩阵的更多相关文章

  1. [jzoj 4722] [NOIP2016提高A组模拟8.21] 跳楼机 解题报告 (spfa+同余)

    题目链接: http://172.16.0.132/senior/#main/show/4722 题目: DJL为了避免成为一只咸鱼,来找srwudi学习压代码的技巧.Srwudi的家是一幢h层的摩天 ...

  2. 【JZOJ4790】【NOIP2016提高A组模拟9.21】选数问题

    题目描述 在麦克雷的面前有N个数,以及一个R*C的矩阵.现在他的任务是从N个数中取出R*C个,并填入这个矩阵中.矩阵每一行的法值为本行最大值与最小值的差,而整个矩阵的法值为每一行的法值的最大值.现在, ...

  3. 【JZOJ4792】【NOIP2016提高A组模拟9.21】整除

    题目描述 麦克雷有一个1~n的排列,他想知道对于一些区间,有多少对区间内的数(x,y),满足x能被y整除. 输入 第一行包含2个正整数n,m.表示有n个数,m个询问. 接下来一行包含n个正整数,表示麦 ...

  4. JZOJ 4732. 【NOIP2016提高A组模拟8.23】函数

    4732. [NOIP2016提高A组模拟8.23]函数 (Standard IO) Time Limits: 1500 ms  Memory Limits: 262144 KB  Detailed ...

  5. 【NOIP2016提高A组模拟9.14】数列编辑器

    题目 分析 比赛上,没有注意到询问只询问光标前面,于是只打了个暴力. 因为询问只询问光标前面,首先,当光标向后每移动到一个位置,顺便将这个位置的前缀和,和最大前缀和求出来. 总之,模拟 #includ ...

  6. 【NOIP2016提高A组模拟9.24】总结

    第一题纯模拟,结果那个出题人脑子似乎进水了,空间限制开了1G!!! 导致我捉摸了半天为什么空间要开那么大,最后只能得出上面的结论. 第二题是个矩阵快速幂,比赛上我没把递推式求出来,但是根据各种乱搞,得 ...

  7. 【JZOJ4711】【NOIP2016提高A组模拟8.17】Binary

    题目描述 输入 输出 样例输入 6 6 8 9 1 13 9 3 1 4 5 2 6 9 1 3 7 2 7 7 1 6 1 2 11 13 样例输出 45 19 21 数据范围 解法 40%暴力即可 ...

  8. 【JZOJ4747】【NOIP2016提高A组模拟9.3】被粉碎的线段树

    题目描述 输入 第一行包括两个正整数,N ,M ,分别表示线段树的宽以及询问次数. 以下N-1 行以先序遍历(dfs深搜顺序)描述一个小R线段树,每行一个正整数表示当前非叶子节点的 mid,保证每个节 ...

  9. 【JZOJ4746】【NOIP2016提高A组模拟9.3】树塔狂想曲

    题目描述 相信大家都在长训班学过树塔问题,题目很简单求最大化一个三角形数塔从上往下走的路径和.走的规则是:(i,j)号点只能走向(i+1,j)或者(i+1,j+1).如下图是一个数塔,映射到该数塔上行 ...

随机推荐

  1. js的简单介绍和相关的必备常识

    一.概念 1.js是JavaScript的缩写,是运行在浏览器端或服务端的依附于页面的脚本语言. 2.js的学习分为:ECMA语法.Dom网页对象模型.Bom浏览器的对象模型 3.ECMA是浏览器厂商 ...

  2. Inoic 滚动条问题

    1.看图说话 2.没有超过一个页,怎样去掉图中的滚动条? 3修改后预览效果

  3. thinkPHP使用中踩的坑,记录一下(不停更)

    版本3.2.3 1.数据库操作中的连贯操作table(),在查询的时候可以切换表,但是在插入,更新的时候请不要使用.例如 D('user')->table('auth')->add($da ...

  4. WPF 禁用中文

    <TextBox InputMethod.IsInputMethodEnabled="False" />

  5. 玩转vue的slot内容分发

    vue的内容分发非常适合"固定部分+动态部分"的组件的场景,固定部分可以是结构固定,也可以是逻辑固定,比如下拉loading,下拉loading只是中间内容是动态的,而拉到底部都会 ...

  6. 洛谷P3298 泉

    时空限制 1000ms / 128MB 题目描述 作为光荣的济南泉历史研究小组中的一员,铭铭收集了历史上x个不同年份时不同泉区的水流指数,这个指数是一个小于. 2^30的非负整数.第i个年份时六个泉区 ...

  7. Django项目:CRM(客户关系管理系统)--21--13PerfectCRM实现King_admin分页页数

    {#table_data_list.html#} {## ————————08PerfectCRM实现King_admin显示注册表的字段表头————————#} {% extends 'king_m ...

  8. 正则中使用ASCII码,取值范围

    [^\x00-\xFF]  : 表示匹配Ascii码大于255的那些字符 基于浏览器的工具: https://regexr.com/

  9. Codeforces 467D

    题目链接 D. Fedor and Essay time limit per test 2 seconds memory limit per test 256 megabytes input stan ...

  10. java并发系列(五)-----如何正确的关闭一个线程

    正确的关闭一个线程可不是简单的事情,由于线程调度的复杂性以及不可控性(毕竟运行都由操作系统做主),先来了解一下interrupt() 1.interrupt() 根据jdk文档的介绍,如下: inte ...