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

题目描述

小明今天突发奇想,想从一张用过的纸中剪出一个长方形。

为了简化问题,小明做出如下规定:

(1)这张纸的长宽分别为n,m。小明讲这张纸看成是由n*m个格子组成,在剪的时候,只能沿着格子的边缘剪。

(2)这张纸有些地方小明以前在上面画过,剪出来的长方形不能含有以前画过的地方。

(3)剪出来的长方形的大小没有限制。

小明看着这张纸,想了好多种剪的方法,可是到底有几种呢?小明数不过来,你能帮帮他吗?

输入格式

第一行两个正整数n,m,表示这张纸的长度和宽度。

接下来有n行,每行m个字符,每个字符为“*”或者“.”。

字符“*”表示以前在这个格子上画过,字符“.”表示以前在这个格子上没画过。

输出格式

仅一个整数,表示方案数。

输入输出样例

输入 #1

6 4

....

.***

...

.
**

...*

.***

输出 #1

38

说明/提示

【数据规模】

对10%的数据,满足1<=n<=10,1<=m<=10

对30%的数据,满足1<=n<=50,1<=m<=50

对100%的数据,满足1<=n<=1000,1<=m<=1000

【思路】

单调队列

先输入数据

处理处每个点往上一共有多少个连续的没有被画过的点

然后每一行f[i][0]和f[i][m + 1]要赋值一个超级小的数

为了让区间边界终止与此

然后顺序扫一遍找出每一个点

左边距离他最近的一个比他矮的点

然后倒叙扫一遍找出每一个点

右边距离他最近的一个比他矮的店

中间的就是它能够构成的矩阵

矩阵组成方式是

左边区间的长度(包括中间点) * 右边区间的长度(包括中间点) * 宽(也就是f[i][j])

累加起来输出就好了

要开long long 哦不然最后两个点过不了

【完整代码】

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<stack>
  4. #define int long long
  5. using namespace std;
  6. const int Max = 1005;
  7. int f[Max][Max];
  8. int a[Max];
  9. int r[Max],l[Max];
  10. signed main()
  11. {
  12. char c;
  13. int n,m;
  14. cin >> n >> m;
  15. for(register int i = 1;i <= n;++ i)
  16. {
  17. for(register int j = 1;j <= m;++ j)
  18. {
  19. cin >> c;
  20. if(c == '*')f[i][j] = 0;
  21. else
  22. f[i][j] = f[i - 1][j] + 1;
  23. }
  24. }
  25. for(int i = 1;i <= n;++ i)
  26. f[i][0] = f[i][m + 1] = -0x7fffffff;
  27. int ans = 0;
  28. for(register int i = 1;i <= n;++ i)
  29. {
  30. stack<int>s1,s2;
  31. s1.push(1),s2.push(m);
  32. for(register int ii = 2,jj = m - 1;ii <= m + 1,jj >= 0;jj --,++ ii)
  33. {
  34. while(!s1.empty() && f[i][ii] < f[i][s1.top()])
  35. {
  36. r[s1.top()] = ii;
  37. s1.pop();
  38. }
  39. while(!s2.empty() && f[i][jj] <= f[i][s2.top()])
  40. {
  41. l[s2.top()] = jj;
  42. s2.pop();
  43. }
  44. s1.push(ii);s2.push(jj);
  45. }
  46. for(register int j = 1;j <= m;++ j)
  47. ans += (j - l[j]) * (r[j] - j) * f[i][j];
  48. }
  49. cout << ans << endl;
  50. return 0;
  51. }

洛谷 P1950 长方形_NOI导刊2009提高(2) 题解的更多相关文章

  1. 洛谷 P1950 长方形_NOI导刊2009提高(2)

    传送门 思路 首先定义\(h\)数组,\(h[i][j]\)表示第\(i\)行第\(j\)列最多可以向上延伸多长(直到一个被用过的格子) 然后使用单调栈算出 \(l_i\)和 \(r_i\) ,分别是 ...

  2. 洛谷 P1951 收费站_NOI导刊2009提高(2) 最短路+二分

    目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例: 输出样例: 说明 思路 AC代码 总结 题面 题目链接 P1951 收费站_NOI导刊2009提高(2) 其 ...

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

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

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

    题目描述 在某个遥远的国家里,有n个城市.编号为1,2,3,…,n. 这个国家的政府修建了m条双向的公路.每条公路连接着两个城市.沿着某条公路,开车从一个城市到另一个城市,需要花费一定的汽油. 开车每 ...

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

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

  6. 洛谷 P1777 帮助_NOI导刊2010提高(03) 解题报告

    P1777 帮助_NOI导刊2010提高(03) 题目描述 Bubu的书架乱成一团了!帮他一下吧! 他的书架上一共有n本书.我们定义混乱值是连续相同高度书本的段数.例如,如果书的高度是30,30,31 ...

  7. 洛谷 P1769 淘汰赛制_NOI导刊2010提高(01)

    P1769 淘汰赛制_NOI导刊2010提高(01) 题目描述 淘汰赛制是一种极其残酷的比赛制度.2n名选手分别标号1,2,3,…,2^n-1,2^n,他们将要参加n轮的激烈角逐.每一轮中,将所有参加 ...

  8. 洛谷 P1801 黑匣子_NOI导刊2010提高(06)(未完)

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

  9. [洛谷P1801]黑匣子_NOI导刊2010提高(06)

    题目大意:两个操作:向一个可重集中加入一个元素:询问第$k$大的数($k$为之前询问的个数加一) 题解:离散化,权值线段树直接查询 卡点:无 C++ Code: #include <cstdio ...

随机推荐

  1. mysql 字符

    只适用mysql5.0以上的版本: 1.一个汉字占多少长度与编码有关:         UTF-8:一个汉字=3个字节            GBK:一个汉字=2个字节 2.varchar(n)表示n ...

  2. python基础_mysql建表、编辑、删除、查询、更新

    1.建一张学生表 包含(id,name,age,sex)2.增加四条数据3.查询表中sex为男的数据4.删除id =3的数据,5.将sex为女的,修改为男 create: CREATE TABLE d ...

  3. 服务端技术选型与考虑(go)

  4. [高清] Java编程思想第四版完整中文高清版

    ------ 郑重声明 --------- 资源来自网络,纯粹共享交流, 如果喜欢,请您务必支持正版!! --------------------------------------------- 下 ...

  5. Linux 中ifconfig和ip addr命令看不到ip

    解决方案: 输入 vi /etc/sysconfig/network-scripts/ifcfg-ens33 将ONBOOT权限改为yes 保存退出,按Esc,输入:wq 重启网络服务,输入 sudo ...

  6. Python接口自动化基础---token鉴权

    有些登录使用cookie,有些登录需要token验证,token传参一般有两种形式,一种是在请求头中,一种是使用URL传参 这里举例说明一下请求头中的token方式: #登录 param1={'use ...

  7. H5打开app指定页面(H5+app项目)

    H5+app项目,在HBuilderX中设置 详情参考官方 https://ask.dcloud.net.cn/article/64 给h5+app设置scheme值,作用:在其它app和h5页面中启 ...

  8. JAVA - Windows下JDK默认安装的配置参数

    JDK版本1.8 JAVA_HOME C:\Program Files\Java\jdk1.8.0_60 CLASSPATH .;%%JAVA_HOME%%\lib;%%JAVA_HOME%%\lib ...

  9. 修改网口速度mii-tool和ethtool

    mii-tool # mii-tool -F 100baseTx-FD media: 100baseT4, 100baseTx-FD, 100baseTx-HD, 10baseT-FD, 10base ...

  10. springboot学习入门简易版九---springboot2.0整合多数据源mybatis mysql8+(22)

    一个项目中配置多个数据源(链接不同库jdbc),无限大,具体多少根据内存大小 项目中多数据源如何划分:分包名(业务)或注解方式.分包名方式类似多个不同的jar,同业务需求放一个包中. 分包方式配置多数 ...