diff --git a/Binary_Search/2439.Minimize-Maximum-of-Array/2439.Minimize-Maximum-of-Array.cpp b/Binary_Search/2439.Minimize-Maximum-of-Array/2439.Minimize-Maximum-of-Array.cpp new file mode 100644 index 000000000..c2b663b6d --- /dev/null +++ b/Binary_Search/2439.Minimize-Maximum-of-Array/2439.Minimize-Maximum-of-Array.cpp @@ -0,0 +1,35 @@ +class Solution { +public: + int minimizeArrayValue(vector& nums) + { + int left = nums[0], right = 1e9; + while (left < right) + { + int mid = left+(right-left)/2; + + long long buff = 0; + int flag = true; + for (int i=0; i mid) + buff -= (x-mid); + else + buff += (mid-x); + if (buff < 0) + { + flag = false; + break; + } + } + + if (flag) + right = mid; + else + left = mid+1; + } + + return left; + + } +}; diff --git a/Binary_Search/2439.Minimize-Maximum-of-Array/Readme.md b/Binary_Search/2439.Minimize-Maximum-of-Array/Readme.md new file mode 100644 index 000000000..e4044f768 --- /dev/null +++ b/Binary_Search/2439.Minimize-Maximum-of-Array/Readme.md @@ -0,0 +1,15 @@ +### 2439.Minimize-Maximum-of-Array + +本题的大体思路就是,如果有一个数字特别大,那么我们希望它能与之前的数字们一起"抹匀",来尽量减少最大值。由于更靠前的数字,只能与更少数量的伙伴一起"抹匀",所以最终呈现出来的最优解形态,应该是piece-wise constant的递减数列。这个数列的第一个元素的大小,就是最终答案。 + +那么这个数字最小是什么呢?并不太容易直接求出来。但是如果我们猜测一个,是容易判断它是否成立的。 + +我们首先猜测最终答案是x。明显,这个x必然不会小于nums[0],因为nums[0]没有机会向前分摊数值。如果x>nums[0],那么这意味着后面的元素有机会向nums[0]分摊一些数值,我们记做"缓冲值":`buff = x-nums[0]`. + +接下来我们看nums[1]。如果`nums[1]>x`,那么不得不让它往前分摊数值,最多能够分摊多少呢?显然就是buff。于是如果`buff> nums[1]-x`,那么就OK,同时`buff-=nums[1]-x`;否则就直接返回失败。反之,如果`nums[1] productQueries(int n, vector>& queries) + { + vectorpowers; + for (int i=0; i<32; i++) + { + if (n%2!=0) + powers.push_back(i); + n/=2; + if (n==0) break; + } + + vectorpresum(powers.size()); + for (int i=0; itwos(32*32,1); + long M = 1e9+7; + for (int i=1; i<32*32; i++) + twos[i] = twos[i-1] * 2 % M; + + vectorrets; + for (auto& query : queries) + { + int l = query[0], r = query[1]; + int diff = presum[r] - (l==0?0:presum[l-1]); + rets.push_back(twos[diff]); + } + return rets; + } +}; diff --git a/Others/2438.Range-Product-Queries-of-Powers/Readme.md b/Others/2438.Range-Product-Queries-of-Powers/Readme.md new file mode 100644 index 000000000..a7f2f5502 --- /dev/null +++ b/Others/2438.Range-Product-Queries-of-Powers/Readme.md @@ -0,0 +1,5 @@ +### 2438.Range-Product-Queries-of-Powers + +对于区间乘积,虽然我们可以借鉴区间求和的思路,采用前缀积相除的方法。但是本题涉及到对大数取模,应该注意到`(a/b) mod M != (a mod M) / (b mod M)`,而引入逆元的话,又显得比较繁琐。所以这道题的切入点应该在别处。 + +因为所有相乘的元素都是2的幂,显然我们知道这个性质,`2^a * 2^b = 2^(a+b)`,所以可以将区间的乘积转化为"指数"区间的求和,再求一次幂即可。 diff --git a/Readme.md b/Readme.md index 8776a509f..fac293316 100644 --- a/Readme.md +++ b/Readme.md @@ -113,6 +113,7 @@ [2137.Pour-Water-Between-Buckets-to-Make-Water-Levels-Equal](https://github.com/wisdompeak/LeetCode/tree/master/Binary_Search/2137.Pour-Water-Between-Buckets-to-Make-Water-Levels-Equal) (M) [2141.Maximum-Running-Time-of-N-Computers](https://github.com/wisdompeak/LeetCode/tree/master/Binary_Search/2141.Maximum-Running-Time-of-N-Computers) (M+) [2226.Maximum-Candies-Allocated-to-K-Children](https://github.com/wisdompeak/LeetCode/tree/master/Binary_Search/2226.Maximum-Candies-Allocated-to-K-Children) (M) +[2439.Minimize-Maximum-of-Array](https://github.com/wisdompeak/LeetCode/tree/master/Binary_Search/2439.Minimize-Maximum-of-Array) (H-) * ``Find K-th Element`` [215.Kth-Largest-Element-in-an-Array](https://github.com/wisdompeak/LeetCode/tree/master/Binary_Search/215.Kth-Largest-Element-in-an-Array) (M) [287.Find-the-Duplicate-Number](https://github.com/wisdompeak/LeetCode/tree/master/Binary_Search/287.Find-the-Duplicate-Number) (H-) @@ -1334,6 +1335,7 @@ [1906.Minimum-Absolute-Difference-Queries](https://github.com/wisdompeak/LeetCode/tree/master/Others/1906.Minimum-Absolute-Difference-Queries) (M+) [2245.Maximum-Trailing-Zeros-in-a-Cornered-Path](https://github.com/wisdompeak/LeetCode/tree/master/Others/2245.Maximum-Trailing-Zeros-in-a-Cornered-Path) (M) [2281.Sum-of-Total-Strength-of-Wizards](https://github.com/wisdompeak/LeetCode/tree/master/Others/2281.Sum-of-Total-Strength-of-Wizards) (H) +[2438.Range-Product-Queries-of-Powers](https://github.com/wisdompeak/LeetCode/tree/master/Others/2438.Range-Product-Queries-of-Powers) (M+) * ``2D Presum`` 1314.Matrix-Block-Sum (M) [1292.Maximum-Side-Length-of-a-Square-with-Sum-Less-than-or-Equal-to-Threshold](https://github.com/wisdompeak/LeetCode/tree/master/Binary_Search/1292.Maximum-Side-Length-of-a-Square-with-Sum-Less-than-or-Equal-to-Threshold) (H-)

AltStyle によって変換されたページ (->オリジナル) /