首页 > 其他分享 >100048.美丽塔 2 - 364

100048.美丽塔 2 - 364

时间:2023-09-24 21:26:11浏览次数:31  
标签:方案 maxHeights len heights 100048 美丽 序列 364

美丽塔2

给你一个长度为 n 下标从 0 开始的整数数组 maxHeights 。

你的任务是在坐标轴上建 n 座塔。第 i 座塔的下标为 i ,高度为 heights[i] 。

如果以下条件满足,我们称这些塔是 美丽 的:

1 <= heights[i] <= maxHeights[i]
heights 是一个 山状 数组。
如果存在下标 i 满足以下条件,那么我们称数组 heights 是一个 山状 数组:

对于所有 0 < j <= i ,都有 heights[j - 1] <= heights[j]
对于所有 i <= k < n - 1 ,都有 heights[k + 1] <= heights[k]
请你返回满足 美丽塔 要求的方案中,高度和的最大值 。

示例 1:

输入:maxHeights = [5,3,4,1,1]
输出:13
解释:和最大的美丽塔方案为 heights = [5,3,3,1,1] ,这是一个美丽塔方案,因为:

  • 1 <= heights[i] <= maxHeights[i]
  • heights 是个山状数组,峰值在 i = 0 处。
    13 是所有美丽塔方案中的最大高度和。
    示例 2:

输入:maxHeights = [6,5,3,9,2,7]
输出:22
解释: 和最大的美丽塔方案为 heights = [3,3,3,9,2,2] ,这是一个美丽塔方案,因为:

  • 1 <= heights[i] <= maxHeights[i]
  • heights 是个山状数组,峰值在 i = 3 处。
    22 是所有美丽塔方案中的最大高度和。
    示例 3:

输入:maxHeights = [3,2,5,5,2,3]
输出:18
解释:和最大的美丽塔方案为 heights = [2,2,5,5,2,2] ,这是一个美丽塔方案,因为:

  • 1 <= heights[i] <= maxHeights[i]
  • heights 是个山状数组,最大值在 i = 2 处。
    注意,在这个方案中,i = 3 也是一个峰值。
    18 是所有美丽塔方案中的最大高度和。

提示:

\[1 <= n == maxHeights <= 10^5\\ 1 <= maxHeights[i] <= 10^9\\ \]

解题思路

见代码注释

code

typedef long long int LL;

class Solution {
public:
    //朴素解法:遍历两侧的递减序列并求和
    //O(n ^ 2)
    
    //预处理两侧递减序列的和并且在枚举的可以直接查询
    //关键:如何在O(n)的时间内预处理出两侧递减序列的和
    //6 5 3 9 2 7
    //i -> n-1的递减序列的和
    //直接找到所有的递减序列再求和是否可以
    //6 5 3 3 2 2
    //显然是不可以的
    //要查找i -> n-1 的递减序列必须从后先前遍历
    //如果使用朴素的解法是O(n ^ 2)的需要根据当前的数值更新后面的结果
    //实际上从后向前维护的就是一个单调栈
    //在维护单调栈的过程中记录序列和
    //7
    //2 2
    //9 2 2
    //....
    //如何求序列和
    //相同的只记录最左边的index
    //个数可以通过index之间的差值计算
    //出栈就是减去个数 * value
    //入栈就是加上个数 * value
    //可以实现在O(1)的时间更新序列和不需要遍历整个stack中元素求和
    
    //前面同理

    long long maximumSumOfHeights(vector<int>& maxHeights) {
        LL ans = 0;
        stack<int> st1;
        int len = maxHeights.size();
        st1.push(len);
        vector<LL> suffix(len + 1,0);
        for(int i = len - 1;i >= 0;i --)
        {
            suffix[i] = suffix[i + 1];
            while(st1.size() > 1 && maxHeights[i] <= maxHeights[st1.top()]) 
            {
                int idx = st1.top();
                st1.pop();
                suffix[i] -= (st1.top() - (LL)idx) * (LL)maxHeights[idx];
            }
            suffix[i] += (st1.top() - (LL)i) * (LL)maxHeights[i];
            st1.push(i);
        }

        //for(int i = 0;i < len;i ++) cout<<suffix[i]<<" ";
        //cout<<endl;

        stack<int> st2;
        vector<LL> pre(len,0);
        st2.push(-1);

        for(int i = 0;i < len;i ++)
        {
            if(i != 0) pre[i] = pre[i - 1];
            while(st2.size() > 1 && maxHeights[i] <= maxHeights[st2.top()])
            {
                int idx = st2.top();
                st2.pop();
                pre[i] -= (idx - (LL)st2.top()) * (LL)maxHeights[idx];
            }
            pre[i] += (i - (LL)st2.top()) * (LL)maxHeights[i];
            st2.push(i);
        }
        //for(int i = 0;i < len;i ++) cout<<pre[i]<<" ";

        for(int i = 0;i < len;i ++) ans = max<LL>(ans,pre[i] + suffix[i] - maxHeights[i]);
        return ans;    
    }
};

标签:方案,maxHeights,len,heights,100048,美丽,序列,364
From: https://www.cnblogs.com/huangxk23/p/17726679.html

相关文章

  • Django SimpleUI打造美丽后台
    DjangoSimpleUI打造美丽后台Django后台美化插件中,SimpleUI处于第一阵营,非常符合国人的审美观。本文将手把手教你如何配置使用SimpleUI,包括自定义菜单和控制面板等高级使用技巧. 安装 第一步pip安装并加入INSTALLED_APPSpipinstalldjango-simpleui ......
  • 【CF1364C】Ehab and Prefix MEXs(构造)
    题目大意:给出长度为\(n(1\len\le10^5)\)的数组\(a\),构造数组\(b\)使得\(a_i=MEX\{b_1,b_2,...,b_1\}\)首先考虑当\(b_1,b_2,...,b_n\)为什么数时,\(a_n=MEX\{b_1,b_2,...,b_n\}\)。然后再考虑当\(b_1,b_2,...,b_{n-1}\)为什么数时,\(a_{n-1}=MEX\{b_1,b_2,...,b_{n-1}\}\)。......
  • 统计一个字符串的 k 子序列美丽值最大的数目
    k子序列指的是s的一个长度为k的子序列,且所有字符都是唯一的,也就是说每个字符在子序列里只出现过一次。定义f(c)为字符c在s中出现的次数。k子序列的美丽值定义为这个子序列中每一个字符c的f(c)之和1.贪心+组合枚举贪心选美丽值最大的字符,对于最后美丽值相......
  • 2834. 找出美丽数组的最小和-360
    找出美丽数组的最小和给你两个正整数:n和target。如果数组nums满足下述条件,则称其为美丽数组。nums.length==n.nums由两两互不相同的正整数组成。在范围[0,n-1]内,不存在两个不同下标i和j,使得nums[i]+nums[j]==target。返回符合条件的美丽数组所可......
  • 范围中美丽整数的数目
    给你正整数low,high和k。如果一个数满足以下两个条件,那么它是美丽的:偶数数位的数目与奇数数位的数目相同。这个整数可以被k整除。请你返回范围[low,high]中美丽整数的数目。1.数位dpclassSolution{public:intcalc(intnum,intk){strings......
  • HDU 5364
    DistributionmoneyTimeLimit:2000/1000MS(Java/Others)  MemoryLimit:65536/65536K(Java/Others)TotalSubmission(s):310  AcceptedSubmission(s):186ProblemDescriptionAFAwanttodistributionhermoneytosomebody.Shedividehermoneyintons......
  • 【BZOJ 3364】Distance Queries 距离咨询 题解
    原题简化题意:有一棵\(n\)个点的树,\(q\)组询问,每次询问回答两点间的距离。令\(dis[i][j]\)表示\(i\)到\(j\)的距离,根节点为\(rt\),则有\(dis[i][j]=dis[rt][i]+dis[rt][j]-2×dis[rt][lca(i,j)]\),按照题意打即可。#include<bits/stdc++.h>usingnamespacestd;#d......
  • [CF364D] Ghd
    题目描述JohnDoeofferedhissisterJaneDoefindthegcdofsomesetofnumbers$a$.Gcdisapositiveinteger$g$,suchthatallnumberfromthesetareevenlydivisibleby$g$andthereisn'tsuch$g'$$(g'>g)$,thatallnum......
  • 美丽的夕阳qsnctfwp
    题目附件查看图片,放大左侧发现建筑物上8个字:龙腾公寓/福阳集团根据文字在搜索引擎中查找,并由此确定城市通过百度地图全景地图查看当地桥梁,并与照片比对调整地图比例尺,记录桥名根据提示qsnctf{河北-石家庄-张桥-李桥}拼接flag并提交即可-End-......
  • 【转载】vSAN其实很简单-更换磁盘可以是件美丽的事情
    vSAN其实很简单-更换磁盘可以是件美丽的事情-连载(1)  日常的IT维护中,磁盘故障是最常见的硬件故障之一了。根据vSAN的设计,vSAN在检测到磁盘故障后会自动在其他可用节点上重建数据(具体机制以后再细说)。我曾经遇到过有些用户的磁盘已经坏了几个月却没有发觉出来,因为vSAN已经默默的......