题目地址:

https://leetcode.com/problems/sum-of-total-strength-of-wizards/

给定给一个长nnn数组AAA,对于每个子数组aaa,求f(a)=min⁡a×∑af(a)=\min a\times \sum af(a)=mina×∑a。求∑a(min⁡a×∑a)\sum_a (\min a\times \sum a)∑a​(mina×∑a)。

设AAA的前缀和数组为ppp,对于A[k]A[k]A[k],我们求出其右边第一个比其小的数A[j]A[j]A[j](不存在则视为j=nj=nj=n)和左边第一个比其小于等于的数A[i]A[i]A[i](不存在则视为i=−1i=-1i=−1),这两个数的位置可以用单调栈得出。那么A[k]A[k]A[k]可以作为A[i:j]A[i:j]A[i:j]的最小值。主要的问题是如何求A[i+1:j−1]A[i+1:j-1]A[i+1:j−1]的所有含A[k]A[k]A[k]的子数组的和的总和。设ppp的前缀和数组为qqq(q[i]q[i]q[i]是ppp的前iii项的和,由于ppp的长度是n+1n+1n+1,qqq的长度则会变为n+2n+2n+2),则含A[k]A[k]A[k]的子数组的和的总和为:(k−i)(q[j+1]−q[k+1])−(j−k)(q[k+1]−q[i+1])(k-i)(q[j+1]-q[k+1]) - (j-k)(q[k+1]-q[i+1])(k−i)(q[j+1]−q[k+1])−(j−k)(q[k+1]−q[i+1])可以这么理解,这个和即为以A[k,k+1,...,j−1]A[k,k+1,...,j-1]A[k,k+1,...,j−1]为结尾的前缀和减去A[i,...,k−1]A[i, ...,k-1]A[i,...,k−1]结尾的前缀和的所有组合的总和,我们可以把被减数汇总,其会重复加k−ik-ik−i次,同理减数也可以汇总,其会重复加j−kj-kj−k次。代码如下:

class Solution {public:int totalStrength(vector<int>& v) {const int MOD = 1e9 + 7;int n = v.size();long sum = 0, ss[n + 2];memset(ss, 0, sizeof ss);for (int i = 1; i <= n; i++) {sum += v[i - 1];ss[i + 1] = (ss[i] + sum) % MOD;}int l[n], r[n];fill(l, l + n, 0);fill(r, r + n, n);stack<int> stk;for (int i = 0; i < n; i++) {while (stk.size() && v[stk.top()] > v[i]) {r[stk.top()] = i;stk.pop();}l[i] = stk.size() ? stk.top() : -1;stk.push(i);}int res = 0;for (int k = 0; k < n; k++) {sum = ((k - l[k]) * (ss[r[k] + 1] - ss[k + 1]) % MOD -(r[k] - k) * (ss[k + 1] - ss[l[k] + 1]) % MOD) % MOD;sum = (sum + MOD) % MOD;res = (res + sum * v[k]) % MOD;}return res;}
};

时空复杂度O(n)O(n)O(n)。

【Leetcode】2281. Sum of Total Strength of Wizards相关推荐

  1. 【LeetCode】Maximize Sum Of Array After K Negations(K 次取反后最大化的数组和)

    这道题是LeetCode里的第1005道题. 题目描述: 给定一个整数数组 A,我们只能用以下方法修改该数组:我们选择某个个索引 i 并将 A[i] 替换为 -A[i],然后总共重复这个过程 K 次. ...

  2. 【leetcode】Path Sum II

    Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given su ...

  3. 【LeetCode】#39组合总和(Combination Sum)

    [LeetCode]#39组合总和(Combination Sum) 加粗样式 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数 ...

  4. 【LeetCode】【HOT 100】2. 两数相加

    [LeetCode][HOT 100]2. 两数相加 文章目录 [LeetCode][HOT 100]2. 两数相加 package hot;import java.util.Arrays;class ...

  5. 【LeetCode】剑指 Offer 34. 二叉树中和为某一值的路径

    [LeetCode]剑指 Offer 34. 二叉树中和为某一值的路径 文章目录 [LeetCode]剑指 Offer 34. 二叉树中和为某一值的路径 package offer;import ja ...

  6. 【LeetCode】剑指 Offer 13. 机器人的运动范围

    [LeetCode]剑指 Offer 13. 机器人的运动范围 文章目录 [LeetCode]剑指 Offer 13. 机器人的运动范围 package offer;public class Solu ...

  7. 【LeetCode】第643题——子数组最大平均数I(难度:简单)

    [LeetCode]第643题--子数组最大平均数I(难度:简单) 题目描述 解题思路 代码详解 注意点 题目描述 给定 n 个整数,找出平均数最大且长度为 k 的连续子数组,并输出该最大平均数. 示 ...

  8. 【leetcode】771. 宝石与石头 (简单)

    [leetcode]771. 宝石与石头 给你一个字符串 jewels 代表石头中宝石的类型,另有一个字符串 stones 代表你拥有的石头. stones 中每个字符代表了一种你拥有的石头的类型,你 ...

  9. 【LeetCode】1641. Count Sorted Vowel Strings(动态规划)

    [LeetCode]1641. Count Sorted Vowel Strings(动态规划) Given an integer n, return the number of strings of ...

最新文章

  1. #数据集#:并发脑电图、心电图和多剂量经颅电刺激行为的数据集
  2. 工业计算机改造报告,工业计算机实验报告..docx
  3. Eigen(6)快操作
  4. jsp中redirect和forward的区别
  5. C#企业级开发案例精解:用经典案例学通 NET技术
  6. android ar人脸贴图,ARCore与ARKit实现人脸贴纸、更换材质等动画效果
  7. 数据科学包14-matplotlib-6种图形的基本画法
  8. 小米手机定时开关机在哪里设置?让你的小米手机“休息一下”
  9. 解读《美国国家BIM标准》 – BIM能力成熟度模型(二)
  10. 软件测试 白盒测试用例设计方法动态 逻辑覆盖(语句覆盖、判定覆盖、条件覆盖、判定条件覆盖、条件组合覆盖、路径覆盖)基本路径测试法
  11. 小白学PCB(一):画一块LM2596降压板,稳定输出5V(选择什么软件画,如何打板)
  12. Effective+Java+中文版
  13. 读理工科研究生的心态
  14. 惠州教学实验室建设与管理
  15. 一篇文章带你弄懂BI和大数据!
  16. 内存XMP是什么意思
  17. Lenovo T420 声音卡解决办法汇总
  18. 计算机键盘被锁怎么解,解开电脑键盘锁的小窍门
  19. fmm3d在windows环境中的编译使用过程
  20. Matlab手动安装工具包

热门文章

  1. 推荐几款优秀的搜素引擎
  2. MATLAB-dxf文件的绘制
  3. 基于java学生补助申请管理系统
  4. vue项目+xlsx+xlsx-style 实现table导出为excel的功能——技能提升
  5. CompletableFuture使用详解(全网看这一篇就行)
  6. static中兴考试题
  7. [网络流24题][CODEVS1915]分配问题(网络流)
  8. js打印跨页怎么让底部留下空白_如何让背单词看得见,摸得着?「纸记卡片 Paper MEMO」上线!自动生成可打印、裁剪的记忆卡片集...
  9. Jackson公司蛋白质裂解和溶解、裂解缓冲液研究
  10. ‘dependencies.dependency.systemPath‘ for cn.ac:xxxx:jar should not point at files