<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>前缀和 on 一共十七划</title>
		<link>https://noirzh.com/tags/%E5%89%8D%E7%BC%80%E5%92%8C/</link>
		<description>Recent content in 前缀和 on 一共十七划</description>
		<generator>Hugo</generator>
		<language>zh-CN</language>
		
		
		
		
			<lastBuildDate>Sat, 17 Feb 2024 16:11:25 +0800</lastBuildDate>
		
			<atom:link href="https://noirzh.com/tags/%E5%89%8D%E7%BC%80%E5%92%8C/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>题解-做菜顺序-排序,贪心,前缀和,一点点证明</title>
				<link>https://noirzh.com/posts/%E9%A2%98%E8%A7%A3-%E5%81%9A%E8%8F%9C%E9%A1%BA%E5%BA%8F/</link>
				<pubDate>Sun, 22 Oct 2023 08:16:17 +0800</pubDate>
				<guid>https://noirzh.com/posts/%E9%A2%98%E8%A7%A3-%E5%81%9A%E8%8F%9C%E9%A1%BA%E5%BA%8F/</guid>
				<description>&lt;blockquote&gt;&#xA;&lt;p&gt;Problem: &lt;a href=&#34;https://leetcode.cn/problems/reducing-dishes/description/&#34;&gt;1402. 做菜顺序&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;!-- toc --&gt;&#xD;&#xA;&lt;h1 id=&#34;思路&#34;&gt;思路&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;注意到没有要求顺序,先排序&lt;/li&gt;&#xA;&lt;li&gt;朴素思想是将大的数越往后放越好,但对于负数,虽然也是越大越往后放越好,但其有可能增加答案,也有可能减少答案,需要一些证明&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h1 id=&#34;解题方法&#34;&gt;解题方法&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;注意到对于负数的选取一定是连续而非跳跃的:假设存在$[a_{i-1},a_i,a_{i+1}].a_i&amp;lt;a_{i+1},$数组,三者均小于0,假如一定要取两个元素,(这种假定的含义是我需要后面的正数有足够的倍数,期望前面提供倍数的负数(代价)最小),选取元素$a_{i-1},a_{i+1}$代价大于选取$a_i,a_{i+1}$&lt;/li&gt;&#xA;&lt;li&gt;推广可知我们会选取所有的正数和部分负数,且负数在排序后的数组中是连续的,并且和正数部分相连&lt;/li&gt;&#xA;&lt;li&gt;实际上是求一个子数组的这个操作最大能多大,可以枚举每一次从哪选,结束一定是在最大的数结束&lt;/li&gt;&#xA;&lt;li&gt;然后简化:注意到相关操作实际上是对于之前结果再加上一次已经遍历的数,所以可以将其转化为一遍扫描的方式&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;时间复杂度, $O(nlogn)$&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;h1 id=&#34;code&#34;&gt;Code&lt;/h1&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Solution&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;maxSatisfaction&lt;/span&gt;(self, satisfaction: List[int]) &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt; int:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        satisfaction&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;sort(reverse&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;True&lt;/span&gt;) &lt;span style=&#34;color:#75715e&#34;&gt;#方便操作&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        res&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        pre&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        now&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; num &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; satisfaction:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            pre&lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt;num&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            now&lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt;pre&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            res&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;max(now,res)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; now&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#66d9ef&#34;&gt;break&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;#之后一定小于0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; res&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
			</item>
			<item>
				<title>题解-移动机器人-数组计算的三种思考方式方式(动态规划,贡献,前缀和)与相关证明</title>
				<link>https://noirzh.com/posts/%E9%A2%98%E8%A7%A3-%E7%A7%BB%E5%8A%A8%E6%9C%BA%E5%99%A8%E4%BA%BA/</link>
				<pubDate>Tue, 10 Oct 2023 08:04:17 +0800</pubDate>
				<guid>https://noirzh.com/posts/%E9%A2%98%E8%A7%A3-%E7%A7%BB%E5%8A%A8%E6%9C%BA%E5%99%A8%E4%BA%BA/</guid>
				<description>&lt;blockquote&gt;&#xA;&lt;p&gt;Problem: &lt;a href=&#34;https://leetcode.cn/problems/movement-of-robots/description/&#34;&gt;2731. 移动机器人&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;!-- toc --&gt;&#xD;&#xA;&lt;h1 id=&#34;前述条件&#34;&gt;前述条件&lt;/h1&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;碰撞和&lt;a href=&#34;https://leetcode.cn/problems/last-moment-before-all-ants-fall-out-of-a-plank/description/&#34;&gt;1503. 所有蚂蚁掉下来前的最后一刻&lt;/a&gt;类似,注意到对于身份没有要求,所以可以直接认为两个机器人碰撞是交换了二者的身份,也可以认为是穿过去了&lt;/li&gt;&#xA;&lt;li&gt;因此能够得到机器人的最终位置,为了方便计算,我们排序&lt;/li&gt;&#xA;&lt;li&gt;数据量为$10^5$,暴力求解不现实&lt;/li&gt;&#xA;&lt;li&gt;以下是三种常用的解决方法,这三种思路最开始的进入方式不同,但是都能得出正确结果&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h1 id=&#34;两种对于距离的计算方法&#34;&gt;两种对于距离的计算方法&lt;/h1&gt;&#xA;&lt;p&gt;算法的时间复杂度均为$O(n)$&lt;/p&gt;&#xA;&lt;h2 id=&#34;动态规划&#34;&gt;动态规划&lt;/h2&gt;&#xA;&lt;h3 id=&#34;思考方式与证明&#34;&gt;思考方式与证明&lt;/h3&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;假设已经计算出来了$a[i]$之前所有的机器人两两之间距离之和为$s$&lt;/li&gt;&#xA;&lt;li&gt;增加一个元素$a[i]$,观察其和之前的所有机器人之间的距离之和,能够发现&#xA;&lt;ol&gt;&#xA;&lt;li&gt;实际上就是与之前的每个元素计算距离&lt;/li&gt;&#xA;&lt;li&gt;$a[i]$与$a[0],a[1]&amp;hellip;.,a[i-1]$之间的距离实际上分别是是$a[i-1]$与$a[0]&amp;hellip;.,a[i-1]$之间的距离加上$a[i]$与$a[i-1]$之间的距离,共$i$个&lt;/li&gt;&#xA;&lt;li&gt;上述结论可以推导:&#xA;设$distance[i]$表示$a[i]$和$a[0],a[1]&amp;hellip;.,a[i-1]$之间的距离之和,有&#xA;$$ distance[i]=i*a[i]+distance[i-1] \distance[0]=0 $$&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;代码&#34;&gt;代码&lt;/h3&gt;&#xA;&lt;p&gt;可以看出来这个公式只与前一个状态有关,因此可以优化空间&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-Python3&#34; data-lang=&#34;Python3&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Solution&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;sumDistance&lt;/span&gt;(self, nums: List[int], s: str, d: int) &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt; int:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        mod&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1000000007&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        n&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;len(nums)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; i,a &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; enumerate(s):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            nums[i]&lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt;d &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; s[i]&lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;R&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;d  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        nums&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;sort()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        res&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        distance&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; i &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; range(&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;,n):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            distance&lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt;i&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;(nums[i]&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;nums[i&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;]) &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#75715e&#34;&gt;#这个方法对于只int的话4*(10**9)会超范围&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            distance&lt;span style=&#34;color:#f92672&#34;&gt;%=&lt;/span&gt;mod  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            res&lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt;distance&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; res&lt;span style=&#34;color:#f92672&#34;&gt;%&lt;/span&gt;mod&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;贡献距离法&#34;&gt;贡献距离法&lt;/h2&gt;&#xA;&lt;h3 id=&#34;思考方式&#34;&gt;思考方式&lt;/h3&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;对于这种什么什么之和的问题可以考虑计算每个片段对结果的贡献&lt;/li&gt;&#xA;&lt;li&gt;在这个题目之中片段就是每个元素之间的距离,我们需要计算的就是这段距离在结果中出现了多少次&lt;/li&gt;&#xA;&lt;li&gt;为了方便理解将每次计算距离视为两点之间的连线,看片段上线的数目就知道这个片段的使用次数&lt;/li&gt;&#xA;&lt;li&gt;从$a[0]-a[1]$这一的角度来看:从$a[0]$连出去了$n-1$条线,每条线都经过了$a[1]$,所以得出$a[0]-a[1]$段的贡献是$n-1$&lt;/li&gt;&#xA;&lt;li&gt;从$a[1]-a[2]$的角度来看,$a[1]$连出去的$n-2$也就是$(n-i-1)$条线覆盖了$a[1]-a[2]$&#xA;&lt;ol&gt;&#xA;&lt;li&gt;但还不够,注意到$a[0]$发出去的线只有一条落在了$a[1]$上,剩下的线也覆盖了$a[2]$&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;希望确切地知道此时到底有多少条线覆盖了这段距离&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;证明&#34;&gt;证明&lt;/h3&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;设$f[i]$表示$a[i]$到$a[i+1]$这段距离对结果的贡献次数&lt;/li&gt;&#xA;&lt;li&gt;同时可知$f[i]$也表示此时距离上面的线段数量&lt;/li&gt;&#xA;&lt;li&gt;从a[i]发出的所有向右的线都会做贡献,这个次数为$n-i$&lt;/li&gt;&#xA;&lt;li&gt;发现$a[i]$之前的线段,也就是参与了$f[i-1]$计算的线段,有一部分落在了$a[i]$上,剩下的部分继续参与$f[i]$的计算&lt;/li&gt;&#xA;&lt;li&gt;可知落在$a[i]$上的线段实际上是a[i]发出的指向左边的线段,其数量为$i$&lt;/li&gt;&#xA;&lt;li&gt;综上&#xA;$f[0]=n-i\f[i]=(f[i-1]-i+n)-i=f[i-1]-2*i+n$&lt;/li&gt;&#xA;&lt;li&gt;$$\displaystyle res=\sum_{i=0}^{n-2}f[i]*(a[i+1]-a[i])$$&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;code&#34;&gt;Code&lt;/h3&gt;&#xA;&lt;p&gt;可以看出只与前一个状态有关,进行空间优化&#xA;代码为了方便对于$f[i]$计算的是$a[i+1]$到$a[i]$&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Solution&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;sumDistance&lt;/span&gt;(self, nums: List[int], s: str, d: int) &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt; int:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      mod&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1000000007&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      n&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;len(nums)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; i,a &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; enumerate(s):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          nums[i]&lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt;d &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; s[i]&lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;R&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;d  &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      nums&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;sort()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      pre&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      res&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; i &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; range(n&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          pre&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;(pre&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;n&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;i&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;%&lt;/span&gt;mod&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          res&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;(res&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;(nums[i&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;]&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;nums[i])&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;pre)&lt;span style=&#34;color:#f92672&#34;&gt;%&lt;/span&gt;mod&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; res&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;前缀和的形式化证明&#34;&gt;前缀和的形式化证明&lt;/h1&gt;&#xA;&lt;p&gt;下面是&lt;a href=&#34;https://leetcode.cn/problems/movement-of-robots/solutions/2304680/nao-jin-ji-zhuan-wan-pai-xu-tong-ji-pyth-we55/&#34;&gt;灵神的证明方式&lt;/a&gt;,与上面的证明相比更加数学,如下&#xA;$ (a[i]−a[0])+(a[i]−a[1])+⋯+(a[i]−a[i−1])=i⋅a[i]−(a[0]+a[1]+⋯+a[i−1])\$ $(a[0]+a[1]+⋯+a[i−1])$可根据前缀和求&#xA;下面是灵神的代码&lt;/p&gt;</description>
			</item>
			<item>
				<title>题解-英雄的力量</title>
				<link>https://noirzh.com/solution-power-of-heros/</link>
				<pubDate>Tue, 01 Aug 2023 06:31:49 +0800</pubDate>
				<guid>https://noirzh.com/solution-power-of-heros/</guid>
				<description>&lt;blockquote&gt;&#xD;&#xA;&lt;p&gt;Problem: &lt;a href=&#34;https://leetcode.cn/problems/power-of-heroes/description/&#34;&gt;2681. 英雄的力量&lt;/a&gt;&lt;/p&gt;&#xD;&#xA;&lt;/blockquote&gt;&#xD;&#xA;&lt;h2&gt;题目描述&lt;/h2&gt;&#xD;&#xA;&lt;p&gt;给你一个下标从&lt;strong&gt;0&lt;/strong&gt;开始的整数数组&lt;code&gt;nums&lt;/code&gt;，它表示英雄的能力值。如果我们选出一部分英雄，这组英雄的&lt;strong&gt;力量&lt;/strong&gt;定义为：&lt;/p&gt;&#xD;&#xA;&lt;ul&gt;&#xD;&#xA;&lt;li&gt;&lt;strong&gt;&lt;code&gt;i&lt;sub&gt;0&lt;/sub&gt;&lt;/code&gt; ，&lt;code&gt;i&lt;sub&gt;1&lt;/sub&gt;&lt;/code&gt; ，… &lt;code&gt;i&lt;sub&gt;k&lt;/sub&gt;&lt;/code&gt;&lt;/strong&gt; 表示这组英雄在数组中的下标。那么这组英雄的力量为 &lt;code&gt;&lt;strong&gt;max(nums[i&lt;sub&gt;0&lt;/sub&gt;],nums[i&lt;sub&gt;1&lt;/sub&gt;] ... nums[i&lt;sub&gt;k&lt;/sub&gt;])&lt;sup&gt;2&lt;/sup&gt; * min(nums[i&lt;sub&gt;0&lt;/sub&gt;],nums[i&lt;sub&gt;1&lt;/sub&gt;] ... nums[i&lt;sub&gt;k&lt;/sub&gt;])&lt;/strong&gt;&lt;/code&gt; 。&lt;/li&gt;&#xD;&#xA;&lt;/ul&gt;&#xD;&#xA;&lt;p&gt;请你返回所有可能的&lt;strong&gt;非空&lt;/strong&gt;英雄组的&lt;strong&gt;力量&lt;/strong&gt;之和。由于答案可能非常大，请你将结果对&lt;code&gt;&lt;strong&gt;10&lt;sup&gt;9 &lt;/sup&gt;+ 7&lt;/strong&gt;&lt;/code&gt;&lt;strong&gt;取余。&lt;/strong&gt;&lt;/p&gt;&#xD;&#xA;&lt;h2&gt;思路&lt;/h2&gt;&#xD;&#xA;&lt;ul&gt;&#xD;&#xA;&lt;li&gt;选取与顺序无关先排序&lt;/li&gt;&#xD;&#xA;&lt;li&gt;接下来只要枚举所有子序列的最大值的平方和最小值的乘积之和&lt;/li&gt;&#xD;&#xA;&lt;li&gt;注意到只和最大值和最小值有关&lt;/li&gt;&#xD;&#xA;&lt;/ul&gt;&#xD;&#xA;&lt;h2&gt;解题方法&lt;/h2&gt;&#xD;&#xA;&lt;ol&gt;&#xD;&#xA;&lt;li&gt;确定了子序列的最大值之后,我们只需要确定子序列里面各个值最小值出现了几次&lt;/li&gt;&#xD;&#xA;&lt;li&gt;也就是确定排序后的$nums[i]$必选且为最大值时,我们假设此时在答案中与除自身之外他的平方相乘的所有值之和为$pre_i$,此时有答案$res_i=nums[i]^2*(pre_i+nums[i])$&lt;/li&gt;&#xD;&#xA;&lt;li&gt;不去管$pre_i$现在为多少,我们假设现在要选取的是$nums[i+1]$为最大值,则注意到对于子序列&#xD;&#xA;&lt;ol&gt;&#xD;&#xA;&lt;li&gt;如果不选$ nums[i] $,$ pre_i$也会和$nums[i+1]$相乘&lt;/li&gt;&#xD;&#xA;&lt;li&gt;如果选取$nums[i]$,对于所有$nums[i]$不是最小值的情况,$pre_i$也会和$nums[i+1]$相乘,而$nums[i]$是最小值的情况只有一个(也就是选取$i$和$i+1$两个)&lt;/li&gt;&#xD;&#xA;&lt;/ol&gt;&#xD;&#xA;&lt;/li&gt;&#xD;&#xA;&lt;li&gt;根据以上的两个推理,我们能够得出 $$ \displaystyle res_{i+1}=nums[i+1]^2 \cdot (pre_i \cdot 2+nums[i]+nums[i+1]) \\ pre_{i+1}=pre_i\cdot 2+nums[i] $$&lt;/li&gt;&#xD;&#xA;&lt;li&gt;$res=\displaystyle\sum^{n}_{i=0} res_i $&lt;/li&gt;&#xD;&#xA;&lt;/ol&gt;&#xD;&#xA;&lt;ul&gt;&#xD;&#xA;&lt;li&gt;时间复杂度$O(nlogn)$&lt;/li&gt;&#xD;&#xA;&lt;li&gt;空间复杂度$O(1)$&lt;/li&gt;&#xD;&#xA;&lt;/ul&gt;&#xD;&#xA;&lt;h2&gt;Code&lt;/h2&gt;&#xD;&#xA;&lt;div&gt;&#xD;&#xA;&lt;div&gt;&#xD;&#xA;&lt;div&gt;&lt;div&gt;&#xD;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-python&#34;&gt;class Solution:&#xD;&#xA;    def sumOfPower(self, nums: List[int]) -&amp;gt; int:&#xD;&#xA;        mod=1000000007&#xD;&#xA;        nums.sort()&#xD;&#xA;        pre=0&#xD;&#xA;        res=0&#xD;&#xA;        for num in nums:&#xD;&#xA;            res=(res+(pre+num)*(num**2)&#xD;&#xA;            pre=(pre*2+num&#xD;&#xA;        return res&lt;/code&gt;&lt;/pre&gt;&#xD;&#xA;&lt;/div&gt;&lt;/div&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;/div&gt;&#xD;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-python&#34;&gt;class Solution {&#xD;&#xA;public:&#xD;&#xA;    int sumOfPower(vector&amp;lt;int&amp;gt;&amp;amp; nums) {&#xD;&#xA;        const int mod=1e9+7;&#xD;&#xA;        sort(nums.begin(),nums.end());&#xD;&#xA;        int res=0,pre=0;&#xD;&#xA;        for (long num:nums){&#xD;&#xA;            res=(res+(num*nu&#xD;&#xA;            pre=(pre*2+num&#xD;&#xA;        }&#xD;&#xA;        return res;&#xD;&#xA;    }&#xD;&#xA;};&#xD;&#xA;&lt;/code&gt;&lt;/pre&gt;</description>
			</item>
	</channel>
</rss>
