一道单调栈的好题啊。。。。。。

思路是很奇妙的,对于每个点(i,j),我们可以算它对答案的贡献(即包含它的矩形数量),包含该点的矩形,点的高度为h[j],点右边的高度一定大于等于h[j],左边的高度一定大于h[j]。

高有h[j]种方案,底边有(j - lj) * (rj - j)种方案,相乘就是该点对答案的贡献。

具体步骤:

1.定义 h[j] 为当前行第 j 列可向上延伸多少(如果当前块被图画那么值为0)
2.使用单调栈算出 li 和 ri​ ,分别是 j中左边第一个(从 j​ 开始)不大于 h[j] 的数和右边第一个(从 j 开始)小于 h[j] 的数
3.(j-lj)*(rj-j)*h[j]的值就是每一个点所能组成的矩形的个数。

 1 #include<bits/stdc++.h>
2 using namespace std;
3 char ch;
4 long long l[1020],r[1020],h[1020],k[1020],n,m,top;
5 int d[1020][1020];
6 long long ans;
7
8 void ddzl(){//左
9 top=0;
10 for(int i=m;i>=1;i--){
11 while(top!=0 && h[i]<=h[k[top]]) l[k[top--]]=i;
12 k[++top]=i;
13 }
14 while(top) l[k[top--]]=0;
15 }
16
17 void ddzr(){//右
18 top=0;
19 for(int i=1;i<=m;i++){
20 while(top!=0 && h[i]<h[k[top]]) r[k[top--]]=i;
21 k[++top]=i;
22 }
23 while(top) r[k[top--]]=m+1;
24 }
25
26 void work(){
27 ddzl();//求左边第一个小等于的下标
28 ddzr();//求右边第一个小于的下标
29 for(int i=1;i<=m;i++)
30 ans+=(i-l[i])*(r[i]-i)*h[i];//累加结果
31 }
32
33 int main(){
34 cin>>n>>m;
35 for(int i=1;i<=n;i++)
36 for(int j=1;j<=m;j++){
37 cin>>ch;
38 if(ch=='*') d[i][j]=1;//标记
39 }
40 for(int i=1;i<=n;i++){
41 for(int j=1;j<=m;j++){
42 h[j]++;
43 if(d[i][j]) h[j]=0;//求该列从最上面到j的最大延伸高度
44 }
45 work();//对每一行累加结果
46 }
47 cout<<ans;
48 }

(单调栈其实不好想啊,难点在于推公式,公式的意义就是每个点对答案的贡献,公式想到了,自然也能想到用单调栈维护)。

最新文章

  1. 精彩 JavaScript 代码片段
  2. history命令详解
  3. 如何通过iframe以post方式提交form表单
  4. “康园圈--互联网+校园平台“项目之sprint2
  5. 解决 “invalid resource directory name”, resource “crunch”
  6. idea项目部署
  7. Android-取消GridView/ListView item被点击时的效果
  8. Nginx - SSI Module
  9. PHP编码规范整理,很全很实用(图文版)
  10. js调用swift相册DEMO(网易新闻)
  11. svn回滚版本1
  12. Redis 持久化和配置文件
  13. PHP 5 Filesystem 函数
  14. html css+div+jquery实现图片轮播
  15. git常用命令总结(资源来自廖雪峰)
  16. 12 postgresql数据库备份和恢复
  17. ArcGIS 栅格数据教程
  18. MemSQL学习笔记-类似MySQL的数据库
  19. Python学习笔记015——文件file的常规操作之一(文本文件)
  20. .net asp iis服务器如何让外部访问自己的网站

热门文章

  1. Mybatis源码解读-插件
  2. JDBC与ODBC的区别
  3. 使用 Liquibase 管理数据库版本 - SpringBoot 2.7 .2 实战基础
  4. LuoguP2523 [HAOI2011]Problem c(概率DP)
  5. BZOJ1787/Luogu4281: [Ahoi2008]Meet 紧急集合
  6. IDEA Git缓慢
  7. monodepth2学习1-原理介绍
  8. virtio 驱动的数据结构理解
  9. 技术管理进阶——技术Leader需要数据思维
  10. 7个技巧让你写出干净的 TSX 代码