题目描述

一组正整数,分别表示由正方体迭起的柱子的高度。若某高度值为x,表示由x个正立方的方块迭起(如下图,0<=x<=5000)。找出所有可能积水的地方(图中蓝色部分),统计它们可能积水的面积总和(计算的是图中的横截面积。一个立方体的位置,为一个单位面积)。

如图:柱子高度变化为 0 1 0 2 1 2 0 0 2 0

图中蓝色部分为积水面积,共有6个单位面积积水。

输入输出格式

输入格式

两行,第一行n,表示有n个数(3<=n<=10000)。第2行连续n个数表示依次由正方体迭起的高度,保证首尾为0。

输出格式

一个数,可能积水的面积。

思路

首先,去前导后导零,并更新l与r,然后对于柱高做一遍前缀和(优化用)。
对于每个柱子,我们分两种情况考虑

第一种:后面有柱子比它来得高,那就取离它最近且比它高的柱子为断点,更新S的值\((S+=min(h[i],h[l])*(i-l-1)-(sum[i-1]-sum[l]); )\),将l更新至断点处,然后将flag定为1,表示有柱子比他高。

第二种:如果flag=0,后面没有柱子比它高,那就取之后柱子中最高的一个做断点(设位置为WZ),然后更新S的值(h[wz]一定比h[l]小)\((S+=h[wz]*(wz-l-1)-(sum[wz-1]-sum[l]);)\),最后将l更新到断点处(l=WZ)

最后当l>=r时退出输出S即可

代码

#include<bits/stdc++.h>
using namespace std;
int n,h[10005],l,r,sum[10005],S=0;
int main()
{
    scanf("%d",&n);
    l=1;r=n;
    for (int i=1;i<=n;i++) scanf("%d",&h[i]),sum[i]=sum[i-1]+h[i];
    while (!h[l]) l++; while (!h[r]) r--;
    while (l<r)
    {
        if (l==r) break;
        bool flag=0;
        for (int i=l+1;i<=n;i++)
        if (h[i]>=h[l])
        {
         flag=1;
         S+=min(h[i],h[l])*(i-l-1)-(sum[i-1]-sum[l]);
         l=i;
         break;
        }
        if (flag==0)
        {
            int maxx=0,wz;
            for (int i=l+1;i<=n;i++) if (h[i]>maxx) wz=i,maxx=h[i];
            S+=h[wz]*(wz-l-1)-(sum[wz-1]-sum[l]);
            l=wz;
        }
    }
    cout<<S<<endl;
    return 0;
}

Luogu P1318 积水面积的更多相关文章

  1. 洛谷 P1318 积水面积

    P1318 积水面积 题目描述 一组正整数,分别表示由正方体迭起的柱子的高度.若某高度值为x,表示由x个正立方的方块迭起(如下图,0<=x<=5000).找出所有可能积水的地方(图中蓝色部 ...

  2. 洛谷P1318 积水面积

    题目描述 一组正整数,分别表示由正方体叠起的柱子的高度.若某高度值为\(x\),表示由\(x\)个正立方的方块迭起(如下图,\(0<=x<=5000\)).找出所有可能积水的地方(图中蓝色 ...

  3. 【洛谷P1318积水面积】最小生成树

    我写一篇绝对原创的题解,算法原创,求洛谷通过!!!(让更多人看到这篇题解) 绝大多数人肯定认为这道题是一道模拟题 以下为正解 我们来看一下这一道题,其实就是找到左右高点,在模拟. 但是这个是正常人的想 ...

  4. luogu【P2745】[USACO5.3]窗体面积Window Area

    这个题 就是个工程题 (然而一开始我并不知道怎么做..还是看nocow的..qwq)(原题入口) 算法为 离散化 + 扫描线  将大坐标变小  并且 用横纵坐标进行扫描 来计算面积 一开始 我想边添加 ...

  5. luogu 1355 神秘大三角 判断点和三角形的位置关系 面积法 叉积法

    题目链接 题目描述 判断一个点与已知三角形的位置关系. 输入输出格式 输入格式: 前三行:每行一个坐标,表示该三角形的三个顶点 第四行:一个点的坐标,试判断该点与前三个点围成三角形的位置关系 (详见样 ...

  6. luogu P4515 [COCI2009-2010#6] XOR

    luogu P4515 [COCI2009-2010#6] XOR 描述 坐标系下有若干个等腰直角三角形,且每个等腰直角三角形的直角顶点都在左下方,两腰与坐标轴平行.被奇数个三角形覆盖的面 积部分为灰 ...

  7. Luogu 1312 【NOIP2011】玛雅游戏 (搜索)

    Luogu 1312 [NOIP2011]玛雅游戏 (搜索) Description Mayan puzzle 是最近流行起来的一个游戏.游戏界面是一个7行5列的棋盘,上面堆放着一些方块,方块不能悬空 ...

  8. [luogu P1169] [ZJOI2007]棋盘制作

    [luogu P1169] [ZJOI2007]棋盘制作 题目描述 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8*8大小的 ...

  9. Luogu 1452 Beauty Contest

    Luogu 1452 Beauty Contest 求平面最远点对,先求出凸包,再找凸包的直径. 使用旋转卡壳,直径一定出现在对踵点对间.比较不同点到同一直线距离可以用叉积算三角形面积来比较. 实现时 ...

随机推荐

  1. Hbase之JavaAPI连接池

    源码: package HbaseOperation; import com.alibaba.fastjson.JSON; import org.apache.hadoop.conf.Configur ...

  2. 苹果ATS 豁免摆乌龙?

    现象 我们的App已经完成了NA部分的ATS适配.网页端由于有使用到第三方的页面,所以开启了网页的豁免权限.关于如何开启豁免及方法,可以参考喵神的Blog最终,我们的适配参数为: NSAllowsAr ...

  3. 【设计模式】—— 备忘录模式Memento

    前言:[模式总览]——————————by xingoo 模式意图 这个模式主要是想通过一个对象来记录对象的某种状态,这样有利于在其他需要的场合进行恢复. 该模式还有跟多可以扩展的地方,比如可以记录多 ...

  4. 伪数组(arguments及字符串)转数组的方法 贼简单

    超简单的伪数组转数组的方法, 简单到令人发指! (这里伪数组使用arguments) 1.使用 Array.prototype.slice Array.prototype.slice.call(arg ...

  5. pgm10

    这部分讨论 MAP 估计.从某个角度上来说,我们可以将这个问题转换成为前面讨论过的: 这样一来我们只需要将原先的 sum-product 换成 max-sum 即可.话虽这么说,我们还是看看 Koll ...

  6. poj1741 Tree(点分治)

    题目链接:http://poj.org/problem?id=1741 题意:求树上两点之间距离小于等于k的点对的数量 思路:点分治模板题,推荐一篇讲的非常好的博客:https://blog.csdn ...

  7. C++11 初始化

    C++11 初始化 统一初始化语法        C++11新添加初始化列表 std::initializer_list<>类型,可以通过{}语法来构造初始化列表 .初始化列表是常数:一旦 ...

  8. [Swerc2014 C]Golf Bot

    题意:给你N个数字,每次利用这N个数字中最多两个数字进行加法运算,来得到目标中的M个数字. Solution: 我们先来看看多项式乘法:\(A(x)=\sum_{i=0}^{n-1}a_ix^i\), ...

  9. Json对象与Json字符串

  10. idea中的pom文件中的jar包下载不了,手动下载jar包的方法

    问题描述: 在pom文件中添加依赖的时候,程序怎么着都是下载不了,而且实验了各种方式: IDEA引MAVEN项目jar包依赖导入问题解决 https://www.cnblogs.com/a845701 ...