P3400 仓鼠窝

题目描述

萌萌哒的Created equal是一只小仓鼠,小仓鼠自然有仓鼠窝啦。

仓鼠窝是一个由n*m个格子组成的行数为n、列数为m的矩阵。小仓鼠现在想要知道,这个矩阵中有多少个子矩阵!(实际上就是有多少个子长方形嘛。)比如说有一个2*3的矩阵,那么1*1的子矩阵有6个,1*2的子矩阵有4个,1*3的子矩阵有2个,2*1的子矩阵有3个,2*2的子矩阵有2个,2*3的子矩阵有1个,所以子矩阵共有6+4+2+3+2+1=18个。

可是仓鼠窝中有的格子被破坏了。现在小仓鼠想要知道,有多少个内部不含被破坏的格子的子矩阵!

输入输出格式

输入格式:

第一行两个正整数n和m,分别表示仓鼠窝的行数n、列数m。

接下来n行,每行m个数,每个数代表对应的格子,非0即1。若为0,表示这个格子被破坏;反之代表这个格子是完好无损的。

输出格式:

仅一个正整数,表示未被破坏的子矩阵的个数。

输入输出样例

输入样例#1: 复制

3 4
1 1 1 1
1 0 1 1
1 1 0 1

输出样例#1: 复制

26

说明

__本题时限2s,内存限制256M,因新评测机速度较为接近NOIP评测机速度,请注意常数问题带来的影响。__

No    n=    m=    备注
1    2    2    无
2    3    3    无
3    5    5    无
4    10    10    无
5    2000    2000    所有格子均未被破坏
6    3000    3000    所有格子均未被破坏
7    2500    3000    有且仅有一个格子被破坏
8    3000    2500    有且仅有一个格子被破坏
9    200    200    无
10    500    500    无
11    500    500    无
12    500    500    无
13    1000    1000    无
14    1000    1000    无
15    1000    1500    无
16    2500    2500    无
17    2500    3000    无
18    3000    2500    无
19    3000    3000    无
20    3000    3000    无

/*
对于每个点,累加高度,看能往右扩展几步。
单调栈实现 栈内元素是每个点能扩展的高度,单调递增
如果当前元素的高度大于栈顶元素的高度,就可以累加宽度并入栈
否则就出栈知道大于为止,这样才可以累加宽度
类似这种情况
****  ******
如果入栈的高度为3,那么一定不能合并第4列的宽度,因为构不成矩形。
每次入栈的时候合并宽度
pair里分别存的是高度和宽度
*/
#include<iostream>
#include<cstdio>
#include<cstring>#define N 3007
#define ll long longusing namespace std;
int n,m,k,top;
int a[N][N],tot[N];
ll ans,cnt;
pair<int,int>sta[N];inline int read()
{int x=0,f=1;char c=getchar();while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}return x*f;
}int main()
{n=read();m=read();for(int i=1;i<=n;i++) for(int j=1;j<=m;j++)a[i][j]=read();for(int i=1;i<=n;i++){cnt=0;top=0;pair<int,int>tmp;for(int j=1;j<=m;j++){if(a[i][j]==0){cnt=top=0;tot[j]=0;continue;}tot[j]++;tmp.first=tot[j];tmp.second=1;while(top && sta[top].first>=tmp.first){tmp.second+=sta[top].second;//合并到一起,宽度++cnt-=sta[top].first*sta[top--].second;//此部分会在下面重复计算所以减去
            }sta[++top]=tmp;cnt+=tmp.first*tmp.second;ans+=cnt;//当前结果就等于入栈的那个点的计算结果
        }}printf("%lld\n",ans);return 0;
}

 

转载于:https://www.cnblogs.com/L-Memory/p/7787916.html

洛谷P3400 仓鼠窝(单调栈)相关推荐

  1. 洛谷10月月赛Round.1| P3400 仓鼠窝[单调栈]

    题目描述 萌萌哒的Created equal是一只小仓鼠,小仓鼠自然有仓鼠窝啦. 仓鼠窝是一个由n*m个格子组成的行数为n.列数为m的矩阵.小仓鼠现在想要知道,这个矩阵中有多少个子矩阵!(实际上就是有 ...

  2. 洛谷 P3400 仓鼠窝

    题目描述 萌萌哒的Created equal是一只小仓鼠,小仓鼠自然有仓鼠窝啦. 仓鼠窝是一个由n*m个格子组成的行数为n.列数为m的矩阵.小仓鼠现在想要知道,这个矩阵中有多少个子矩阵!(实际上就是有 ...

  3. 洛谷P4147 玉蟾宫(单调栈解决)

    题目 题目链接 题目背景 有一天,小猫 rainbow 和 freda 来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地. 题目描述 这片土地被分成 N\times ...

  4. 单调栈求全1(或全0)子矩阵的个数 洛谷P5300与或和 P3400仓鼠窝

    爆零好爽,被中学生虐好爽,还好我毕业得早 求全1(或全0)子矩阵的个数,看了题解有好几种思路,我学了三种,但有两种不是很理解,而且也没另外那个跑得快,所以简单讲述一一下我会的那种来自Caro23333 ...

  5. 信息学奥赛一本通 1924:【03NOIP普及组】栈 | 洛谷 P1044 [NOIP2003 普及组] 栈

    [题目链接] ybt 1924:[03NOIP普及组]栈 洛谷 P1044 [NOIP2003 普及组] 栈 [题目考点] 递推.递归 栈 [解题思路]:一维递推 设数组a,a[i]表示i个数组成的数 ...

  6. 洛谷 P2186 小Z的栈函数

    洛谷 P2186 小Z的栈函数 题目 题目描述 小Z最近发现了一个神奇的机器,这个机器的所有操作都是通过维护一个栈来完成的,它支持如下11个操作: NUM X:栈顶放入X. POP:抛弃栈顶元素. I ...

  7. 【洛谷 P1638】 【单调队列】 逛画展

    [洛谷 P1638] [单调队列] 逛画展 题目 解题思路 先求出最前面囊括所有画的位置 然后如果左边界的画不止存在一次,左边界右移 不断扩展右边界,求取答案 代码 #include<iostr ...

  8. 洛谷P3412 仓鼠找$Sugar\ II$题解(期望+统计论?)

    洛谷P3412 仓鼠找\(Sugar\ II\)题解(期望+统计论?) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1327573 原题链接:洛谷P3412 ...

  9. 【洛谷P3400】仓鼠窝

    题目描述 萌萌哒的Created equal是一只小仓鼠,小仓鼠自然有仓鼠窝啦. 仓鼠窝是一个由n*m个格子组成的行数为n.列数为m的矩阵.小仓鼠现在想要知道,这个矩阵中有多少个子矩阵!(实际上就是有 ...

最新文章

  1. 绑定服务调用本地服务中的方法
  2. 自动化来势汹汹,未来的程序员该何去何从?
  3. 虚拟机linux快捷键,虚拟机控制与Linux快捷键
  4. 互联网公司中秋节礼盒大比拼(2019版)
  5. vue - 禁止input[number]输入 +、-、e 符号,并且只能输入两位小数
  6. SpringBoot:EasyExcel动态字段(不创建对象)多sheet、多文件|压缩包格式导出
  7. Photoshop入门学习
  8. Windows搭建cloudever对接OneDrive教程(新版)
  9. 对象存储、文件存储、块存储区别介绍
  10. 如何查询网站服务器类型
  11. Linux 磁盘分区及文件系统挂载
  12. 决策树 建模_主题建模到类别树中
  13. 一加8T 原装65W WARP闪充 充电功率记录
  14. 笔记:单轴上的动量守恒
  15. 程序每次读入一个正三位数,然后输出逆序的数字。注意,当输入的数字含有结尾的0时,输出不应带有前导的0。比如输入700,输出应该是7。
  16. 五个有用的微信公众号运营技巧!
  17. 激活函数relu、leaky-relu、elu、selu、serlu比较
  18. [置顶]谷歌大牛 Jeff Dean 是如何成为互联网战神的
  19. uniapp使用字体包,更换个性化字体
  20. uva 12563 劲歌金曲

热门文章

  1. Linux运维面试题-01
  2. [签约录用] 大学毕业生必须知道的那些事:三方协议与报到证
  3. 电商直播系统开发Android10.0 导航栏和状态栏动态控制合集
  4. Matlab:无穷和 NaN
  5. 服务器显示器黑屏只有鼠标看得见,win10桌面黑屏只能看鼠标怎么办_桌面黑屏只有鼠标解决方法...
  6. 流水账之 QQ农场 (VS) 农民伯伯的农场
  7. ITOP4412 RFID RC522模块
  8. 多线激光雷达+imu的gazebo仿真
  9. 黑帽python第二版(Black Hat Python 2nd Edition)读书笔记 之 第四章 使用SCAPY掌控网络(2)Scapy实现ARP缓存投毒
  10. 职业选手cfg文件怎么用_新版本盗贼怎么玩?职业选手来教你!