<p>You are given two <strong>0-indexed</strong> arrays <code>nums</code> and <code>cost</code> consisting each of <code>n</code> <strong>positive</strong> integers.</p>

<p>You can do the following operation <strong>any</strong> number of times:</p>

<ul>
	<li>Increase or decrease <strong>any</strong> element of the array <code>nums</code> by <code>1</code>.</li>
</ul>

<p>The cost of doing one operation on the <code>i<sup>th</sup></code> element is <code>cost[i]</code>.</p>

<p>Return <em>the <strong>minimum</strong> total cost such that all the elements of the array </em><code>nums</code><em> become <strong>equal</strong></em>.</p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>

<pre>
<strong>Input:</strong> nums = [1,3,5,2], cost = [2,3,1,14]
<strong>Output:</strong> 8
<strong>Explanation:</strong> We can make all the elements equal to 2 in the following way:
- Increase the 0<sup>th</sup> element one time. The cost is 2.
- Decrease the 1<sup><span style="font-size: 10.8333px;">st</span></sup> element one time. The cost is 3.
- Decrease the 2<sup>nd</sup> element three times. The cost is 1 + 1 + 1 = 3.
The total cost is 2 + 3 + 3 = 8.
It can be shown that we cannot make the array equal with a smaller cost.
</pre>

<p><strong class="example">Example 2:</strong></p>

<pre>
<strong>Input:</strong> nums = [2,2,2,2,2], cost = [4,2,8,1,3]
<strong>Output:</strong> 0
<strong>Explanation:</strong> All the elements are already equal, so no operations are needed.
</pre>

<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>n == nums.length == cost.length</code></li>
	<li><code>1 &lt;= n &lt;= 10<sup>5</sup></code></li>
	<li><code>1 &lt;= nums[i], cost[i] &lt;= 10<sup>6</sup></code></li>
	<li>Test cases are generated in a way that the output doesn&#39;t exceed&nbsp;2<sup>53</sup>-1</li>
</ul>

class Solution {
public:
    long long minCost(vector<int>& nums, vector<int>& cost) {
        int n = nums.size();
        
        // Combine nums and cost into a vector of pairs and sort by nums
        vector<pair<int, int>> vpi;
        for (int i = 0; i < n; i++) {
            vpi.push_back({nums[i], cost[i]});
        }
        sort(vpi.begin(), vpi.end());

        // Calculate prefix sums for weights and weighted positions
        vector<long long> prefixSums(n), pre(n);
        prefixSums[0] = vpi[0].second;
        pre[0] = (long long)vpi[0].first * vpi[0].second;
        
        for (int i = 1; i < n; i++) {
            prefixSums[i] = prefixSums[i - 1] + vpi[i].second;
            pre[i] = pre[i - 1] + (long long)vpi[i].first * vpi[i].second;
        }

        long long ans = LLONG_MAX;

        // Traverse each possible target value
        for (int target = vpi[0].first; target <= vpi[n - 1].first; target++) {
            // Find the first position where nums >= target
            int it = lower_bound(vpi.begin(), vpi.end(), make_pair(target, 0),
                                 [](const pair<int, int>& p1, const pair<int, int>& p2) { 
                                     return p1.first < p2.first; 
                                 }) - vpi.begin();

            // Compute costs for left and right sides
            long long c = (it > 0 ? prefixSums[it - 1] : 0) * target - (it > 0 ? pre[it - 1] : 0);
            long long d = (prefixSums[n - 1] - (it > 0 ? prefixSums[it - 1] : 0)) * target 
                        - (pre[n - 1] - (it > 0 ? pre[it - 1] : 0));

            // Update the minimum cost
            ans = min(ans, abs(c) + abs(d));
        }

        return ans;
    }
};

48500