首页 > 其他分享 >区间贡献法

区间贡献法

时间:2023-05-19 21:27:12浏览次数:40  
标签:arr int back 贡献 vector 区间 monoStack empty

1. 英雄的力量 (数学规律)

2. 子数组的最小值(最大值)之和

3. 子数组的最小乘积的最大值

单调栈+前缀和
class Solution {
public:
    int maxSumMinProduct(vector<int>& arr) {
        const int mod = 1e9+7;
        //由于是正数,只用计算最大区间即可
        //先求最小值区间
        int n = arr.size();
        vector<int> monoStack; //单调栈
        vector<int> left(n), right(n);//左右边界
        for (int i = 0; i < n; i++) {//从左往右找左边更小值
            while (!monoStack.empty() && arr[i] <= arr[monoStack.back()]) {//把更大的值挤出来,相等的视为更大,区间计算的时候不影响
                monoStack.pop_back();
            }
            left[i] = monoStack.empty() ? 0 : monoStack.back()+1; //左边界
            monoStack.emplace_back(i);//放入坐标
        }
        monoStack.clear();
        for (int i = n - 1; i >= 0; i--) { //从右往左找右边更小值
            while (!monoStack.empty() && arr[i] < arr[monoStack.back()]) {
                monoStack.pop_back();
            }
            right[i] = monoStack.empty() ? n : monoStack.back(); //右边界
            monoStack.emplace_back(i);
        }

        vector<long long> presum(n+1);
        for(int i=0;i<n;i++)
            presum[i+1] = presum[i]+arr[i];

        long long ans = 0;
        for (int i = 0; i < n; i++)  //计算以当前值为最小值最大区间的最小乘积
            ans = max(ans,(presum[right[i]]-presum[left[i]])*arr[i]);
        return ans%mod;
    }
};

4. 巫师的总力量和

标签:arr,int,back,贡献,vector,区间,monoStack,empty
From: https://www.cnblogs.com/929code/p/17416312.html

相关文章

  • 【P4331 [BalticOI 2004]】Sequence 数字序列 题解(左偏树维护动态区间中位数)
    左偏树维护动态区间中位数。传送门P4331BalticOI2004Sequence数字序列。Solution1我的思路和题解前半部分完全重合了((如果按照单调不增去分割\(a\)序列的话,对于每一段我们能很简单地得出它的最佳答案:中位数。发现严格单调很难做,很难拿捏,考虑对\(a\)序列的每一项都进......
  • 435. 无重叠区间(贪心)
    labuladong题解思路难度中等963给定一个区间的集合 intervals ,其中 intervals[i]=[starti,endi] 。返回 需要移除区间的最小数量,使剩余区间互不重叠 。 示例1:输入:intervals=[[1,2],[2,3],[3,4],[1,3]]输出:1解释:移除[1,3]后,剩下的区间没有重......
  • mysql update语法 竟然不支持limit区间限制
    首先查询可以这样写,没毛病的SELECT*fromaLIMIT1000,2000 1.然后看一个不是区间的limit,更新满足条件的前1000条,没问题updateaseta.imp_date=4wherea.is_sync=0limit10002.这样写是错误的updateaseta.imp_date=4wherea.is_sync=0limit1001,2000......
  • 区间dp
    ICPCBeijing2017J,PanguandStoneshttp://oj.daimayuan.top/course/8/problem/327题意:有n堆石子,需要合并成一堆,但每次合并必须合并>=L且<=R堆,代价为总和,求最小代价。(n<=100)题解:经典的石子合并是两两合并,而此处是多堆合并,直接枚举所有合并不现实,我们考虑多加一维状态,dp[i]......
  • hdu:LCIS(线段树+区间合并)
    ProblemDescriptionGivennintegers.Youhavetwooperations:UAB:replacetheAthnumberbyB.(indexcountingfrom0)QAB:outputthelengthofthelongestconsecutiveincreasingsubsequence(LCIS)in[a,b].InputTinthefirstline,indicatingt......
  • 利用主成分分析PCA先进行数据降维,根据累计贡献率确定最终输入几个变量,降低数据维度,提
    利用主成分分析PCA先进行数据降维,根据累计贡献率确定最终输入几个变量,降低数据维度,提高模型的预测准确性和运算速度,然后在用遗传算法和粒子群算法对BP模型做参数优化,只需要替换数据即可,程序点运行以后就可以直接运行,不用分段运行ID:1250668336204479......
  • 先利用PCA做主成分分析,通过累计贡献率确定最佳主成分数,然后再进行BP回归预测分析,两个
    先利用PCA做主成分分析,通过累计贡献率确定最佳主成分数,然后再进行BP回归预测分析,两个算法已经都写在一起了,可以直接运行,不用分段运行。ID:2635668336340841......
  • 基于PCA主成分分析的BP神经网络回归预测先对数据集进行主成分分析,自主根据贡献率选择
    基于PCA主成分分析的BP神经网络回归预测先对数据集进行主成分分析,自主根据贡献率选择主成分,用PCA以后数据进行BP神经网络回归预测。PCA-BP回归预测模型模型,MATLAB语言,代码注释清楚。ID:2330691020511958......
  • 团队绩效贡献和未来打算
    本次团队绩效中我的贡献无疑是最低的,因为诸多的事情,前半段时间每天晚上都没有时间参加团队合作只有课下和周六日才有机会参与其中,所以对于代码的参与并不是很多,大部分时间都是在跟随他们学习新东西,然后将他们的贡献和我的一部分学习进行整理博客,之后校里的活动结束,我得以脱身,之后......
  • 树状数组--动态维护区间操作
    树状数组(二元索引树/二元下标树/BinaryIndexedTree,BIT/FenwickTree):树状数组虽名为数组,但从其英文名(BinaryIndexedTree)可看出它本质上是一种被表达为树的数据结构。对于大小为n的序列nums,最基本的树状数组以O(logn)时间复杂度同时支持如下两种操作。1)更......