#include<iostream> #include<vector> #include<set> #include<algorithm> using namespace std; class Solution{ public: struct Point{ int x; int y; bool operator<(const Point& other) const{ if (x!=other.x)return x<other.x; return y < other.y; } }; static bool cmp(const Point &a, const Point &b){ return a.x < b.x ||(a.x == b.x && a.y < b.y); } static bool cmp1(const Point &a, const Point &b){ return a.y < b.y ||(a.y == b.y && a.x < b.x); } void print_vec(set<Point> x){ for(auto e: x){ cout<<'('<<e.x<<','<<e.y<<"), "; } cout<<endl; } int numIdleDrives(vector<int> x, vector<int> y){ vector<Point> poi; set<Point> hor; set<Point> ver; int n = x.size(); for(int i = 0 ; i < n ; i++){ poi.push_back({x[i], y[i]}); } sort(poi.begin(), poi.end(), cmp); int cur_x = poi[0].x; int sum_x = 0; Point last_point = poi[0]; hor.insert(last_point); // horizontal for(int i = 1 ; i < n ; i++){ Point cur_p = poi[i]; if(cur_p.x == cur_x){ sum_x += 1; } else{ if(sum_x >= 2) hor.insert(last_point); hor.insert(cur_p); sum_x = 1; cur_x = cur_p.x; } last_point = cur_p; } //vertical sort(poi.begin(), poi.end(), cmp1); int cur_y = poi[0].y; int sum_y = 1; last_point = poi[0]; ver.insert(last_point); for(int i = 1 ; i < n ; i++){ Point cur_p = poi[i]; if(cur_p.y == cur_y){ sum_y += 1; } else{ if(sum_y >= 2) ver.insert(last_point); ver.insert(cur_p); sum_y = 1; cur_y = cur_p.y; } last_point = cur_p; } set<Point> rlt; for(const auto& point : ver){ rlt.insert(point); } for(const auto& point : hor){ rlt.insert(point); } return n - rlt.size(); } }; int main(){ Solution *sol = new Solution(); vector<int>x = {0, 0, 0, 0, 0, 1, 1, 1, 2, -1, -1, -2, -1}; vector<int>y = {-1, 0, 1, 2, -2, 0, 1, -1, 0, 1, -1, 0, 0}; cout<<sol->numIdleDrives(x,y)<<endl; vector<int>x1 = {1, 1, 1, 2, 2, 2, 2, 3, 3, 3}; vector<int>y1 = {1, 2, 3, 1, 2, 3, 5, 1, 2, 3}; cout<<sol->numIdleDrives(x1,y1)<<endl; vector<int>x2 = {0, -1,0,0,3,5,4,4,4}; vector<int>y2 = {0,0,1,-1,0,0,1,-1,0}; cout<<sol->numIdleDrives(x2,y2)<<endl; } // {0,1},{0,4},{1,0},{2,2},{1,3},{0,4},{2,5},{3,4}