题目描述

chenzeyu97的家可以看成是一个n*m的矩阵,每块区域都有独一无二的海拔高度h(h>0)!其最大值为n*m。

现在他要选择一个子矩阵摆放一张桌子,在他眼里,这样摆放桌子的美观度为这个子矩阵中所有元素中值的最小值,他想知道,如果他要求摆放桌子的美观度为i,那么可以选择多少种子矩阵呢?

对于所有可能的i值(1≤i≤n*m),你都应该得出其方案数,这样你就能顶替蒟蒻hzwer获得被请客的资格!

题解:http://hzwer.com/4727.html

输入

第1行:两个整数N,M;

接下来N行:每行m个整数,描述一个N*M的矩阵.

30%的数据1≤n,m≤50;

100%的数据1≤n,m≤300.

输出

输出N*M行,每行一个整数,第i行表示美观度i的方案数.

样例输入 Copy

2 3
2 5 1
6 3 4

样例输出 Copy

6
4
5
1
1
1

提示

【样例解释】

美观度为1的情况:

在2*3的矩阵中,分别选择如下的子矩阵:选择第1行第3列、选择第1行第2列~第1行第3列、选择第1行第1列~第1行第3列、选择第1行第3列~第2行第3列、选择第1行第2列~第2行第3列、选择第1行第1列~第2行第3列,其美观度均为1,共6种情况;

美观度为2的情况:

在2*3的矩阵中,分别选择如下的子矩阵:选择第1行第1列、选择第1行第1列~第1行第2列、选择第1行第1列~第2行第1列、选择第1行第1列~第2行第2列,共4种情况。

以此类推…

思路

  • 这题是单调栈的题目,但用单调队列就会T,因为如果要用单调队列,就还要去枚举一下滑动窗口的长度,所以就多了一个n,所以就T掉了。
  • 讲一下正解,不用想,一定要去枚举左右区间,l->r.
  • 我们要知道每一个行区间l--->r的最小值,这个可以用l-1---->r 用O(1)转移过来。
  • 现在我们就要在行上去统计答案。
  • 现在原题就变成了如何对一个数列,用O(n)的时间复杂度去求出最小值
  • 此时我们只要知道当前的是A{X},前一个比他小的值是A[Y],然后这中间的一堆没用的东西就没用了。因为这里面的都没有对答案造成贡献,所以这区间的就可以不管了
  • 然后具体实现就是如果要把一个点放到单调栈里,只要栈顶的最小值比他大,就将栈顶给这个点,并不断统计答案的影响。
  • f数组表示当前的往前的最长区间,然后答案就是向前最大的长度*向后最大的长度(乘法原理,我一直以为是公式,然后被机房大佬疯狂嘲讽)
  • mn里存下预处理好的高度。
  • 然后放到单调栈里,不断的弹,然后就是统计答案了
  •  #include<bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    const int MAX = ;
    int n, m;
    int a[MAX][MAX], sta[MAX], top, mn[MAX];
    LL f[MAX], ans[MAX * MAX]; int read()
    {
    char c;
    int num, f = ;
    while (c = getchar(), !isdigit(c))
    if (c == '-')
    f = -;
    num = c - '';
    while (c = getchar(), isdigit(c))
    num = num * + c - '';
    return f * num;
    }
    void calc()
    {
    int i, j;//手动写一个单调栈,去模拟将一个点放入后的贡献。
    LL sum;
    top = ;
    for (i = ; i <= n; i++)
    {
    f[i] = ;
    sum = ;
    while (top && mn[i] < mn[sta[top]])
    {
    ans[mn[sta[top]]] += f[sta[top]] * sum;
    sum += f[sta[top]];
    f[i] += f[sta[top]];
    top--;
    }
    sta[++top] = i;
    }
    sum = ;
    while (top)
    {
    ans[mn[sta[top]]] += f[sta[top]] * (sum + );
    sum += f[sta[top]];
    top--;
    }
    }
    int main()
    {
    int i, j, k;
    n = read();
    m = read();
    memset(ans, , sizeof(ans));
    memset(f, , sizeof(f));
    for (i = ; i <= n; i++)
    for (j = ; j <= m; j++)
    a[i][j] = read();
    for (i = ; i <= m; i++)
    {
    memset(mn, , sizeof(mn));
    for (j = i; j <= m; j++)
    {
    for (k = ; k <= n; k++)
    mn[k] = min(mn[k], a[k][j]);//这就是一个简单的预处理,存的就是从l开始的每一个区间的高度
    calc();
    }
    }
    for (i = ; i <= n * m; i++)
    printf("%d\n", ans[i]);
    return ;
    }

[校内自测 NOIP模拟题] chenzeyu97要请客(单调栈)的更多相关文章

  1. 2018.10.30 NOIP模拟 字胡串(单调栈+容斥)

    传送门 对于每个点,用单调栈求出它左右第一个比他大的位置. 然后对每个点O(logai)O(log_{a_i})O(logai​​)求出第一个拥有跟它不同二进制位的位置. 然后容斥一下就行了. 代码

  2. 【入门OJ】2003: [Noip模拟题]寻找羔羊

    这里可以复制样例: 样例输入: agnusbgnus 样例输出: 6 这里是链接:[入门OJ]2003: [Noip模拟题]寻找羔羊 这里是题解: 题目是求子串个数,且要求简单去重. 对于一个例子(a ...

  3. NOIP模拟题汇总(加厚版)

    \(NOIP\)模拟题汇总(加厚版) T1 string 描述 有一个仅由 '0' 和 '1' 组成的字符串 \(A\),可以对其执行下列两个操作: 删除 \(A\)中的第一个字符: 若 \(A\)中 ...

  4. 9.9 NOIP模拟题

    9.9 NOIP模拟题 T1 两个圆的面积求并 /* 计算圆的面积并 多个圆要用辛普森积分解决 这里只有两个,模拟计算就好 两圆相交时,面积并等于中间两个扇形面积减去两个三角形面积 余弦定理求角度,算 ...

  5. 8.22 NOIP 模拟题

      8.22 NOIP 模拟题 编译命令 g++ -o * *.cpp gcc -o * *.c fpc *.pas 编译器版本 g++/gcc fpc 评测环境 位 Linux, .3GHZ CPU ...

  6. NOIP模拟题17.9.26

    B 君的任务(task)[题目描述]与君初相识,犹如故人归.B 君看到了Z 君的第一题,觉得很难.于是自己出了一个简单题.你需要完成n 个任务,第i 任务有2 个属性ai; bi.其中ai 是完成这个 ...

  7. noip模拟题题解集

    最近做模拟题看到一些好的题及题解. 升格思想: 核电站问题 一个核电站有N个放核物质的坑,坑排列在一条直线上.如果连续M个坑中放入核物质,则会发生爆炸,于是,在某些坑中可能不放核物质. 任务:对于给定 ...

  8. 【DP】【构造】NOIp模拟题 演讲 题解

        极其考思维的好题 题目背景 众所周知,$\mathrm{Zdrcl}$是一名天天$\mathrm{AK}$的高水平选手. 作为一民长者,为了向大家讲述自己$\mathrm{AK}$的经验,他决 ...

  9. 6.19 noip模拟题(题目及解析转自 hzwer 2014-3-15 NOIP模拟赛)

    Problem 1 高级打字机(type.cpp/c/pas) [题目描述] 早苗入手了最新的高级打字机.最新款自然有着与以往不同的功能,那就是它具备撤销功能,厉害吧. 请为这种高级打字机设计一个程序 ...

随机推荐

  1. MySQL 视图(合并多表数据)引发的严重性能问题

    问题背景: 一.客户环境连续多次出现性能问题,系统登入异常,数据库CPU告警. 处理过程: 1>协助排查数据库性能问题时发现如下两个较频繁的SQL导致严重的性能问题(均使用了视图合并多表数据): ...

  2. hihoCode 1075 : 开锁魔法III

    时间限制:6000ms 单点时限:1000ms 内存限制:256MB 描述 一日,崔克茜来到小马镇表演魔法. 其中有一个节目是开锁咒:舞台上有 n 个盒子,每个盒子中有一把钥匙,对于每个盒子而言有且仅 ...

  3. icon font在sketch中的下载与安装

    icon font的下载安装: 1.首先打开sketch--插件--管理插件--获取插件--搜索 icon font--点击icon font--clone or download--下载的是一个sk ...

  4. 快速入门Maven(三)

    一.整合ssh框架的Maven项目 1.传递依赖 只添加了一个struts2-core依赖,发现项目中出现了很多jar, 这种情况叫 依赖传递 2.依赖版本冲突的解决 (1)第一声明优先原则(就是谁写 ...

  5. PHP 调试时中断了事务

    1.错误:Uncaught PDOException: SQLSTATE[HY000]: General error: 1205 Lock wait timeout exceeded; try res ...

  6. 手把手教你搭建HEXO免费博客

    一.环境搭建 node安装 百度搜索node,进入官网.下载稳定版: 下载好后直接打开安装 我这里将其安装在D盘(可以自己选择安装位置) 可以看到安装包中已经自带npm包管理工具 等待安装完成后,WI ...

  7. java集合之ArrayList链表基础

    ArrayList可变数组 : arrayList继承AbstractList抽象类,实现list接口,底层基于数组实现.可存放null,除了非同步的之外,大致等同Vector.适用快速访问,复制.序 ...

  8. Linux下mqttServer搭建

    1.apache-apollo 创建服务 tar -zxvf apache-apollo-1.7-unix-distro.tar.gz cd /home/bk/apache-apollo-/bin . ...

  9. Spring Boot 2.X(十二):定时任务

    简介 定时任务是后端开发中常见的需求,主要应用场景有定期数据报表.定时消息通知.异步的后台业务逻辑处理.日志分析处理.垃圾数据清理.定时更新缓存等等. Spring Boot 集成了一整套的定时任务工 ...

  10. Nginx 热部署和日志切割,你学会了吗?

    上篇文章,我们已经安装好 Nginx,并且配置好 Nginx 文件后,这个时候我就需要操作 Nginx 的命令行了,这篇文章主要讲解 Nginx 命令行相关知识,并通过日常遇到的热部署.切割日志文件场 ...