<p>You are given two integers <code>n</code> and <code>k</code> and two integer arrays <code>speed</code> and <code>efficiency</code> both of length <code>n</code>. There are <code>n</code> engineers numbered from <code>1</code> to <code>n</code>. <code>speed[i]</code> and <code>efficiency[i]</code> represent the speed and efficiency of the <code>i<sup>th</sup></code> engineer respectively.</p>

<p>Choose <strong>at most</strong> <code>k</code> different engineers out of the <code>n</code> engineers to form a team with the maximum <strong>performance</strong>.</p>

<p>The performance of a team is the sum of its engineers&#39; speeds multiplied by the minimum efficiency among its engineers.</p>

<p>Return <em>the maximum performance of this team</em>. Since the answer can be a huge number, return it <strong>modulo</strong> <code>10<sup>9</sup> + 7</code>.</p>

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

<pre>
<strong>Input:</strong> n = 6, speed = [2,10,3,1,5,8], efficiency = [5,4,3,9,7,2], k = 2
<strong>Output:</strong> 60
<strong>Explanation:</strong> 
We have the maximum performance of the team by selecting engineer 2 (with speed=10 and efficiency=4) and engineer 5 (with speed=5 and efficiency=7). That is, performance = (10 + 5) * min(4, 7) = 60.
</pre>

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

<pre>
<strong>Input:</strong> n = 6, speed = [2,10,3,1,5,8], efficiency = [5,4,3,9,7,2], k = 3
<strong>Output:</strong> 68
<strong>Explanation:
</strong>This is the same example as the first but k = 3. We can select engineer 1, engineer 2 and engineer 5 to get the maximum performance of the team. That is, performance = (2 + 10 + 5) * min(5, 4, 7) = 68.
</pre>

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

<pre>
<strong>Input:</strong> n = 6, speed = [2,10,3,1,5,8], efficiency = [5,4,3,9,7,2], k = 4
<strong>Output:</strong> 72
</pre>

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

<ul>
	<li><code>1 &lt;= k &lt;= n &lt;= 10<sup>5</sup></code></li>
	<li><code>speed.length == n</code></li>
	<li><code>efficiency.length == n</code></li>
	<li><code>1 &lt;= speed[i] &lt;= 10<sup>5</sup></code></li>
	<li><code>1 &lt;= efficiency[i] &lt;= 10<sup>8</sup></code></li>
</ul>

class Solution {
public:
    void remove(map<int,int>& mp,int key){
        mp[key]--;
        if(!mp[key]){
            mp.erase(mp.find(key));
        }
    }
    int maxPerformance(int n, vector<int>& speed, vector<int>& efficiency, int k) {
        vector<pair<int,int>> v;
        for(int i=0;i<n;i++){
            v.push_back({efficiency[i],speed[i]});
        }
        sort(v.begin(),v.end());
        // for(int i=0;i<n;i++){
        //     cout<<v[i].first<<" "<<v[i].second<<endl;
        // }
        // cout<<endl;
        long long int temp=0;
        long long int sum=0;
        map<int,int> mp,waste;
        for(int i=1;i<n;i++){
            waste[v[i].second]++;
        }
        for(int i=0;i<k-1;i++){
            auto it=waste.end();
            it--;
            mp[it->first]++;
            sum+=it->first;
            remove(waste,it->first);
        }
        // cout<<"left"<<endl;
        // for(auto it=mp.begin();it!=mp.end();it++){
        //     cout<<it->first<<" "<<it->second<<endl;
        // }
        // cout<<"right"<<endl;
        // for(auto it=waste.begin();it!=waste.end();it++){
        //     cout<<it->first<<" "<<it->second<<endl;
        // }
        temp=(1LL*v[0].first*(sum+v[0].second));
        // cout<<sum<<endl<<temp<<endl<<endl;
        for(int i=1;i<n;i++){
            if(waste.find(v[i].second)!=waste.end()){
                remove(waste,v[i].second);
            }
            else{
                sum-=v[i].second;
                remove(mp,v[i].second);
                if(!waste.empty()){
                    auto it=waste.end();
                    it--;
                    mp[it->first]++;
                    sum+=it->first;
                    remove(waste,it->first);
                }
            }
        // cout<<"left"<<endl;
        // for(auto it=mp.begin();it!=mp.end();it++){
        //     cout<<it->first<<" "<<it->second<<endl;
        // }
        // cout<<"right"<<endl;
        // for(auto it=waste.begin();it!=waste.end();it++){
        //     cout<<it->first<<" "<<it->second<<endl;
        // }
            temp=max(temp,(1LL*v[i].first*(sum+v[i].second)));
                    // cout<<sum<<endl<<temp<<endl<<endl;
        }
        int ans=temp%(1000000007);
        return ans;
    }
};
51484