Problem Description

正如你所知道从前有一个人叫s_sin,她拥有着坐拥三千舰狼的梦想!然而天不遂人愿当她踏进hentai collection的大门之后,现实让她领略到了无情。身为一个坚强的妹子,她知道即使出门大破,即使十一连抽全是R,也要坚信着“玄不救非,氪不改命”,而自己是一个欧白这样最初的信仰!

有一天s_sin率领着她的舰狼们到达了某海峡,以一个N*M的矩阵表示,每一个元素为w或者b。其中b为暗礁,暗礁上是不允许有舰狼存在的。而s_sin也相信着一个道理,那就是只有把她的舰狼们组成矩形,她才能有足够的信仰在打败了最终boss之后捞到心仪的新舰狼。请问s_sin有多少种获取足够信仰的方法?(即在N*M的矩阵中有多少个全部由w组成的子矩形)
Input

输入第一行为一个正整数N,M表示有N行M列的矩阵。

接下来N行每行有M个字母为b或者w,如描述中所述。
Output

求N*M的矩阵中有多少个全部由w组成的子矩形。
Sample Input
2 3
bbb
www
2 2
bw
wb
Sample Output
6
2
Hint
1<=M,N<=2000
Source
福州大学第十二届程序设计竞赛

一行行考虑,单调栈维护,得到每一列最远可以往左边扩展到的位置
那么height[j] * len就是由这一列产生的,但是要注意,前面比这一列矮的列,向右扩展到这一列,其实还有矩形,所以要把那一列产生的矩形加上去

/*************************************************************************> File Name: fzu2190.cpp> Author: ALex> Mail: zchao1995@gmail.com > Created Time: 2015年05月10日 星期日 21时43分44秒************************************************************************/#include <functional>
#include <algorithm>
#include <iostream>
#include <fstream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <queue>
#include <stack>
#include <map>
#include <bitset>
#include <set>
#include <vector>using namespace std;const double pi = acos(-1.0);
const int inf = 0x3f3f3f3f;
const double eps = 1e-15;
typedef long long LL;
typedef pair <int, int> PLL;static const int N = 2010;
char mat[N][N];
int height[N][N];
PLL Stack[N];
int Top;
int L[N];
int sum[N];int main() {int n, m;while (~scanf("%d%d", &n, &m)) {for (int i = 1; i <= n; ++i) {scanf("%s", mat[i] + 1);}memset(height, 0, sizeof(height));for (int i = 1; i <= m; ++i) {height[i][0] = 0;for (int j = 1; j <= n; ++j) {height[i][j] = height[i][j - 1];if (mat[j][i] == 'w') {++height[i][j];}else {height[i][j] = 0;}}}LL ans = 0;for (int i = 1; i <= n; ++i) {Top = 0;for (int j = m; j >= 1; --j) {L[j] = j;sum[j] = 0;}sum[0] = 0;for (int j = m; j >= 1; --j) {if (!Top) {Stack[++Top] = make_pair(height[j][i], j);}else {while (Top) {PLL u = Stack[Top];if (u.first <= height[j][i]) {break;}L[u.second] = j + 1;--Top;}Stack[++Top] = make_pair(height[j][i], j);}}while (Top) {PLL u = Stack[Top];--Top;L[u.second] = 1;}for (int j = 1; j <= m; ++j) {if (!height[j][i]) {continue;}int l = L[j];sum[j] = (LL)height[j][i] * (j - l + 1);if (l - 1 >= 1) {sum[j] += sum[l - 1];}ans += sum[j];}}printf("%lld\n", ans);}return 0;
}

fzu2190---非提的救赎 (单调栈)相关推荐

  1. Fzu-2190 非提的救赎 (单调栈)

    Problem Description 正如你所知道从前有一个人叫s_sin,她拥有着坐拥三千舰狼的梦想!然而天不遂人愿当她踏进hentai collection的大门之后,现实让她领略到了无情.身为 ...

  2. fzoj Problem 2190 非提的救赎 【单调栈】

    题目链接:fzoj Problem 2190 非提的救赎 Problem 2190 非提的救赎 Accept: 106 Submit: 312 Time Limit: 1000 mSec Memory ...

  3. leetcode:6080. 使数组按非递减顺序排列【单调栈 + 合并】

    分析 保存一个单调递减的stack,元素是(num, max+t) 遇到大于等于栈顶的,把栈顶的挪出来,然后记录同一次挪出的最大的max_t 如果挪完st还有剩余的话,max_t ++ 然后ans就是 ...

  4. A - 非提的救赎 Fzu-2190 (单调栈)

    Problem Description 正如你所知道从前有一个人叫s_sin,她拥有着坐拥三千舰狼的梦想!然而天不遂人愿当她踏进hentai collection的大门之后,现实让她领略到了无情.身为 ...

  5. 后缀数组 ---- 2018~2019icpc焦作H题[后缀数组+st表+二分+单调栈]

    题目链接 题目大意: 给出nnn个数,定义f[l,r]f[l,r]f[l,r]表示 区间[l,r][l,r][l,r]的最大值,求所有 子区间的最大值的和,要求相同的子区间只能算一次 比如数列 5 6 ...

  6. 0x11.基本数据结构 — 栈与单调栈

    目录 一.栈 0.AcWing 41. 包含min函数的栈 (自己造栈) 1.AcWing 128. 编辑器 (对顶栈) 2.AcWing 129. 火车进栈 3.AcWing 130. 火车进出栈问 ...

  7. 【数据结构】单调栈和单调队列 详解+例题剖析

    算法:单调栈和单调队列 一.单调栈和单调队列 二.单调栈例题 1.模板题入门 2.不懂不要急,看这道题 三.单调队列例题 1.入门 2.进阶 一.单调栈和单调队列 单调栈和单调队列与普通的栈,队列不同 ...

  8. 直方图中最大的矩形(遍历与单调栈)

    给定 n 个非负整数,用来表示柱状图中各个柱子的高度.每个柱子彼此相邻,且宽度为 1 . 求在该柱状图中,能够勾勒出来的矩形的最大面积. 以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [ ...

  9. CodeForces - 1407D Discrete Centrifugal Jumps(单调栈+dp)

    题目链接:点击查看 题目大意:给出 n 个大楼的高度记为 h,现在需要从第一个大楼到达第 n 个大楼,问最小步数是多少,只有满足以下条件时才能从 i 移动到 j ,设 i < j: 题目分析:无 ...

最新文章

  1. 如何忽略word的单词检错功能
  2. 爱上MVC~为非法进行Action的用户提供HttpStatusCodeResult
  3. Hadoop2.2.0集群在RHEL6.2下的安装实战
  4. 进程环境详解(四)---getenv、putenv和setenv函数详解
  5. 熊逸《唐诗50讲》田园篇 - 学习笔记与感想
  6. 【51Nod - 1163】最高的奖励 (贪心+优先队列 或 妙用并查集)
  7. vuedraggle choose_如何拆分员工工资条,教你一招一学就会。(五)函数CHOOSE
  8. NSAttributedString
  9. 「代码随想录」96.不同的二叉搜索树【动态规划】详解!
  10. 使用DISM++精简windows系统
  11. bat代码雨代码流星_怎么制作无限弹窗效果? 限弹窗代码bat文件分享
  12. HTML设置地址栏收藏夹图标
  13. Texlive安装失败解决方法
  14. win10用计算机分区,win10怎么分区,详细教您win10怎么对磁盘进行分区
  15. 网站、手机验证码开发(手机注册验证)
  16. 几种通信方式的介绍及详解
  17. 【C语言】从零开始的C语言小游戏之路(总)
  18. 免费开放可转盲文字库 阿里健康大药房呼吁关注视障群体用药安全
  19. Python语言程序设计基础_实验2 基本数据类型和运算_答案_通识教育必修课程_上海师范大学
  20. 2022年知网研学“研究生科研素养提升”系列公益讲座题库答案分享一波

热门文章

  1. Linux 下检查 VT-d / IOMMU 是否开启
  2. Redis过期策略---实现原理
  3. JSON的正确格式及JSON与实体类相互转换
  4. [附源码]java毕业设计网上手机商城
  5. 这里有20万个虎年微信红包封面免费领取!
  6. AVR单片机用progisp下载报错flash verify error at :0h
  7. 心路历程 部分感想
  8. 8-数据可视化-地图可视化
  9. “爱拍照”的OPPO逆袭战:合并一加,跑步造车
  10. 3d设计计算机配置,专业设计师选什么电脑配置?2018年专业3D建模渲染电脑配置推荐(2)...