<p>Given an array of <code>points</code> where <code>points[i] = [x<sub>i</sub>, y<sub>i</sub>]</code> represents a point on the <strong>X-Y</strong> plane and an integer <code>k</code>, return the <code>k</code> closest points to the origin <code>(0, 0)</code>.</p>

<p>The distance between two points on the <strong>X-Y</strong> plane is the Euclidean distance (i.e., <code>&radic;(x<sub>1</sub> - x<sub>2</sub>)<sup>2</sup> + (y<sub>1</sub> - y<sub>2</sub>)<sup>2</sup></code>).</p>

<p>You may return the answer in <strong>any order</strong>. The answer is <strong>guaranteed</strong> to be <strong>unique</strong> (except for the order that it is in).</p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>
<img alt="" src="https://assets.leetcode.com/uploads/2021/03/03/closestplane1.jpg" style="width: 400px; height: 400px;" />
<pre>
<strong>Input:</strong> points = [[1,3],[-2,2]], k = 1
<strong>Output:</strong> [[-2,2]]
<strong>Explanation:</strong>
The distance between (1, 3) and the origin is sqrt(10).
The distance between (-2, 2) and the origin is sqrt(8).
Since sqrt(8) &lt; sqrt(10), (-2, 2) is closer to the origin.
We only want the closest k = 1 points from the origin, so the answer is just [[-2,2]].
</pre>

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

<pre>
<strong>Input:</strong> points = [[3,3],[5,-1],[-2,4]], k = 2
<strong>Output:</strong> [[3,3],[-2,4]]
<strong>Explanation:</strong> The answer [[-2,4],[3,3]] would also be accepted.
</pre>

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

<ul>
	<li><code>1 &lt;= k &lt;= points.length &lt;= 10<sup>4</sup></code></li>
	<li><code>-10<sup>4</sup> &lt;= x<sub>i</sub>, y<sub>i</sub> &lt;= 10<sup>4</sup></code></li>
</ul>

class Solution {
public:
    vector<vector<int>> kClosest(vector<vector<int>>& points, int k) {

        auto calculate_distance=[](const std::vector<int>& point){return std::sqrt(point[0]*point[0]+point[1]*point[1]);};
        auto comp=[](auto a, auto b){return a.second<b.second;};


        std::vector<std::pair<std::vector<int>, double>> maxheap;

        for (auto& point:points){
            double dist=calculate_distance(point);
            if (maxheap.size()<k){
                maxheap.emplace_back(std::move(point), dist);
                std::push_heap(maxheap.begin(), maxheap.end(), comp);
            }
            else if (dist<maxheap[0].second){
                std::pop_heap(maxheap.begin(), maxheap.end(), comp);
                std::swap(maxheap.back().first, point);
                maxheap.back().second=dist;
                std::push_heap(maxheap.begin(), maxheap.end(), comp);
            }
        }

        std::vector<std::vector<int>> ans;

        for (auto& point_pair:maxheap){
            ans.emplace_back(std::move(point_pair.first));
        }

        return ans;





        // std::vector<std::vector<int>> maxheap;
        // maxheap.reserve(k);

        // for (auto& point:points){
        //     if (maxheap.size()<k){
        //         maxheap.emplace_back(std::move(point));
        //         std::push_heap(maxheap.begin(), maxheap.end(), comp);
        //         continue;
        //     }

        //     if (calculate_distance(point)<calculate_distance(maxheap[0])){
        //         std::pop_heap(maxheap.begin(), maxheap.end(), comp);
        //         std::swap(maxheap.back(), point);
        //         std::push_heap(maxheap.begin(), maxheap.end(), comp);
        //     }
        // }

        // return maxheap;



        // std::sort(points.begin(), points.end(), [calculate_distance](auto a, auto b){return calculate_distance(a)<calculate_distance(b);});
        
        // points.resize(k);
        // return points;
        
    }
};
130578