P1950 长方形_NOI导刊2009提高(2)

题意:给你\(n\times m\)的矩形,求没有*的子矩形数量。\(1\leq n,m\leq 1000\)。

数据比较弱的题目是luoguP1191,\(1\leq n,m \leq 100\)。甚至可以用\(O(n^4)\)水过。

这道题的最优解法\(O(n^2)\)是这样的:

  • 枚举子矩形的底边,预处理出每一列可以往上延伸的长度\(h[i]\)。
  • 跑两次单调栈,第一次找到每个数右边第一个小于它的数\(l[j]\),第二次找到每个数左边第一个小于等于它的数\(r[j]\)。
  • 枚举每一列,那么这个点对答案的贡献就是\((j - l[j] + 1) \times (r[j] - j + 1) \times h[i]\)。

其实枚举的\(j\)就是看看如果这个点是整个大矩形的短板,能够为答案贡献多少个矩形。高度就是从\(1\)到\(h[i]\),共\(h[i]\)个。

两次单调栈要有一次小于等于!同时有多个短板的话可能会算重,我们这样算就不重不漏了。

有一个小细节容易错:在单调栈统计的时候,记录的答案不是那个\(i\),而是相应的\(i-1\)或\(i+1\)。手摸一下就知道了。

代码:

#include<bits/stdc++.h>const int maxn = 1005;
char ch[maxn][maxn];
int h[maxn];
int g1[maxn], g2[maxn];
int n, m;
long long ans;
void init() {// print//for(int i = 1; i <= m; i++) printf("%d ", h[i]);//printf("\n");memset(g1, 0, sizeof g1);memset(g2, 0, sizeof g2);std::stack<int> sta;// 找到第一个小于我的for(int i = 1; i <= m; i++) {while(!sta.empty() && h[sta.top()] > h[i]) {g2[sta.top()] = i - 1; sta.pop();// 是前面的那个}sta.push(i);}while(!sta.empty()) {g2[sta.top()] = m; sta.pop();}// print//for(int i = 1; i <= m; i++) printf("%d ", g2[i]);//printf("\n");for(int i = m; i >= 1; i--) {while(!sta.empty() && h[sta.top()] >= h[i]) {g1[sta.top()] = i + 1; sta.pop();// 是前面的那个}sta.push(i);}while(!sta.empty()) {g1[sta.top()] = 1; sta.pop();}// print//for(int i = 1; i <= m; i++) printf("%d ", g1[i]);//printf("\n");
}
int main() {scanf("%d %d", &n, &m);for(int i = 1; i <= n; i++) {scanf("%s", ch[i] + 1);for(int j = 1; j <= m; j++) {if(ch[i][j] == '*') h[j] = 0;else h[j]++;}init();for(int j = 1; j <= m; j++) {int temp = (j - g1[j] + 1) * (g2[j] - j + 1) * h[j];// print//printf("%d ", temp);ans += temp;}//printf("\n");}printf("%lld\n", ans);return 0;
}

转载于:https://www.cnblogs.com/Garen-Wang/p/10402070.html

P1950 长方形_NOI导刊2009提高(2)[单调栈][贡献法]相关推荐

  1. 洛谷——P1951 收费站_NOI导刊2009提高(2)

    https://www.luogu.org/problem/show?pid=1951 题目描述 在某个遥远的国家里,有n个城市.编号为1,2,3,-,n. 这个国家的政府修建了m条双向的公路.每条公 ...

  2. [洛谷P1951]收费站_NOI导刊2009提高(2)

    题目大意:有一张$n$个点$m$条边的图,每个点有一个权值$w_i$,有边权,询问从$S$到$T$的路径中,边权和小于$s$,且$\max\limits_{路径经过k}\{w_i\}$最小,输出这个最 ...

  3. 方程的解_NOI导刊2010提高(01) 组合数

    题目描述 佳佳碰到了一个难题,请你来帮忙解决. 对于不定方程a1+a2+-+ak-1+ak=g(x),其中k≥2且k∈N,x是正整数,g(x)=x^x mod 1000(即x^x除以1000的余数), ...

  4. P1801 黑匣子_NOI导刊2010提高(06)

    P1801 黑匣子_NOI导刊2010提高(06) 题目描述 Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个 ...

  5. P1799 数列_NOI导刊2010提高(06)

    P1799 数列_NOI导刊2010提高(06) f[i][j]表示前i个数删去j个数得到的最大价值. if(i-j==x) f[i][j]=max(f[i][j],f[i-1][j]+1); els ...

  6. 洛谷 P1795 无穷的序列_NOI导刊2010提高(05)

    P1795 无穷的序列_NOI导刊2010提高(05) 题目描述 有一个无穷序列如下: 110100100010000100000- 请你找出这个无穷序列中指定位置上的数字 输入输出格式 输入格式: ...

  7. 洛谷P1807 最长路_NOI导刊2010提高(07) 求有向无环图的 最长路 图论

    洛谷P1807 最长路_NOI导刊2010提高(07) 图论 求有向无环图的 最长路 首先阐明一点 最长路dijkstra 是不能做 (当然我是不会做的,不过我貌似看到过网上的dalao有用dijst ...

  8. 洛谷 P1796 汤姆斯的天堂梦_NOI导刊2010提高(05)

    P1796 汤姆斯的天堂梦_NOI导刊2010提高(05) 题目描述 汤姆斯生活在一个等级为0的星球上.那里的环境极其恶劣,每天12小时的工作和成堆的垃圾让人忍无可忍.他向往着等级为N的星球上天堂般的 ...

  9. 洛谷——P1775 古代人的难题_NOI导刊2010提高(02) P1936 水晶灯火灵(斐波那契数列)...

    P1775 古代人的难题_NOI导刊2010提高(02) P1936 水晶灯火灵 斐波那契数列 1.x,y∈[1-k],且x,y,k∈Z 2.(x^2-xy-y^2)^2=1 给你一个整数k,求一组满 ...

最新文章

  1. qlabel 边加载边更新_盘点十四款国产进口边三轮,挎斗子摩托车,售价从1万至60多万...
  2. 屌丝giser成长记-大学篇
  3. mysql sycho_Java面试题 - osc_p1rj1z8j的个人空间 - OSCHINA - 中文开源技术交流社区
  4. jq中查找上级_【节能学院】电能管理系统在福州三岐小学项目中的设计及应用...
  5. ubuntu命令模式中文乱码
  6. Nginx 运维之域名验证
  7. Maven学习总结(22)——Maven常用插件介绍
  8. 面向对象的JavaScript基本知识指南大全
  9. 数据结构c语言版 严蔚敏 课本源码
  10. android手机常用浏览器,Android手机 三大浏览器对比评测
  11. jquery实现多选框
  12. 移动硬盘安装linux,thinkpad sl400笔记本安装vista,双系统
  13. Matlab用saveas函数自动编号保存图片
  14. 计算机组装维修设置还原点,怎样恢复出厂设置组装电脑
  15. jvm学习路线(简洁明了)
  16. 〖Python 数据库开发实战 - Python与Redis交互篇⑮〗- 综合案例 - 新闻管理系统 - 更新所编辑新闻状态(根据输入内容进行保存操作)
  17. 感知算法-超声波三角定位测量方法
  18. 一个自动化工厂有哪些必备的配置
  19. java 防篡改_用JAVA二十分钟撸一个简易图片防篡改
  20. Python中既有列表,何必再有数组(NumPy‘s ndarray)?

热门文章

  1. mariadb密码问题
  2. 分布式监控系统开发【day38】:报警阈值程序逻辑解析(三)
  3. Python函数式编程,map/reduce,filter和sorted
  4. linux_basics
  5. 在线CSV转YAML工具
  6. 线程安全之原子性Atomic(AtomicInteger|LongAdder|AtomicLong)
  7. 计算机考试模拟系统无法进入,全国计算机等级考试上机考试模拟系统使用说明...
  8. android美颜功能吗,Android美颜sdk接入之前需要知道这些知识吗
  9. 304902阿里巴巴Java开发手册1.4.0
  10. 延禧宫有刺客!快把他收了!