#include <iostream>
#include <iterator>
#include <vector>
#include <map>
#include <list>
#include <string>
#include <algorithm>
using namespace std;
int times;
class Point
{
private:
int x,y;
public:
Point() : x(0),y(0){}
Point(int x,int y):x(x),y(y){}
Point(const Point& p) : x(p.x),y(p.y) { cout << "copying" <<x<<","<<y<<endl;times++;}
double slopeTo(const Point& that) const
{
if (x == that.x && y == that.y) return - numeric_limits<double>::infinity();
if (x == that.x) return numeric_limits<double>::infinity();
if (y == that.y) return 0;
return (that.y - y) / (double)(that.x - x);
}
bool operator< (const Point& that)const
{
if (y < that.y) return true;
if (y == that.y && x < that.x) return true;
return false;
}
friend ostream& operator<< (ostream&, const Point& p);
};
class cmpBySlope
{
private:
Point& origin;
public:
cmpBySlope(const cmpBySlope& other)
:origin(other.origin)
{
cout << "cmpBySlope copy!" << endl;
}
cmpBySlope(Point& a) : origin(a){}
bool operator() (const Point* left,const Point* right)const
{
return origin.slopeTo(*left) < origin.slopeTo(*right);
}
};
ostream& operator<< (ostream& out, const Point& p)
{
cout << "(" << p.x << "," << p.y << ")" ;
return out;
}
int N;
vector<Point*> v;
void create()
{
v.push_back(new Point(28000,1000));
v.push_back(new Point(28000,5000));
v.push_back(new Point(28000,13500));
v.push_back(new Point(23000,16000));
v.push_back(new Point(1000,18000));
v.push_back(new Point(13000,21000));
v.push_back(new Point(2000,22000));
v.push_back(new Point(3000,26000));
v.push_back(new Point(3500,28000));
v.push_back(new Point(4000,30000));
cout << "During initialization : " << times << endl;
cout << "Input reading has complete!" << endl;
}
bool cmp(const Point* p,const Point* q)
{
return (*p)<(*q);
}
int main(void)
{
create();
int before = times;
cout << "Sort by natural order : ";
sort(v.begin(),v.end(),cmp);
for (Point* p : v)
cout << *p << " ";
cout << endl;
cout << "During soring : " << (times - before) << endl;
cout << "Sort by slope : ";
before = times;
sort(v.begin(),v.end(),cmpBySlope(*v[2]));
for (Point* p : v)
{
cout << *p << " ";
}
cout << endl;
cout << "During soring : " << (times - before) << endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aXRlcmF0b3I+CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxtYXA+CiNpbmNsdWRlIDxsaXN0PgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8YWxnb3JpdGhtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwppbnQgdGltZXM7CmNsYXNzIFBvaW50CnsKICAgIHByaXZhdGU6CiAgICAgICAgaW50IHgseTsKICAgIHB1YmxpYzoKICAgICAgICBQb2ludCgpIDogeCgwKSx5KDApe30KICAgICAgICBQb2ludChpbnQgeCxpbnQgeSk6eCh4KSx5KHkpe30KICAgICAgICBQb2ludChjb25zdCBQb2ludCYgcCkgOiB4KHAueCkseShwLnkpIHsgIGNvdXQgPDwgImNvcHlpbmciIDw8eDw8IiwiPDx5PDxlbmRsO3RpbWVzKys7fQogICAgICAgIGRvdWJsZSBzbG9wZVRvKGNvbnN0IFBvaW50JiB0aGF0KSBjb25zdAogICAgICAgIHsKICAgICAgICAgICAgaWYgKHggPT0gdGhhdC54ICYmIHkgPT0gdGhhdC55KSByZXR1cm4gLSBudW1lcmljX2xpbWl0czxkb3VibGU+OjppbmZpbml0eSgpOwogICAgICAgICAgICBpZiAoeCA9PSB0aGF0LngpIHJldHVybiBudW1lcmljX2xpbWl0czxkb3VibGU+OjppbmZpbml0eSgpOwogICAgICAgICAgICBpZiAoeSA9PSB0aGF0LnkpIHJldHVybiAwOwogICAgICAgICAgICByZXR1cm4gKHRoYXQueSAtIHkpIC8gKGRvdWJsZSkodGhhdC54IC0geCk7CiAgICAgICAgfQogICAgICAgIGJvb2wgb3BlcmF0b3I8IChjb25zdCBQb2ludCYgdGhhdCljb25zdAogICAgICAgIHsKCiAgICAgICAgICAgIGlmICh5IDwgdGhhdC55KSByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgaWYgKHkgPT0gdGhhdC55ICYmIHggPCB0aGF0LngpIHJldHVybiB0cnVlOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgZnJpZW5kIG9zdHJlYW0mIG9wZXJhdG9yPDwgKG9zdHJlYW0mLCBjb25zdCBQb2ludCYgcCk7Cn07CgpjbGFzcyBjbXBCeVNsb3BlCnsKICAgIHByaXZhdGU6CiAgICAgICAgUG9pbnQmIG9yaWdpbjsKICAgIHB1YmxpYzoKICAgICAgICBjbXBCeVNsb3BlKGNvbnN0IGNtcEJ5U2xvcGUmIG90aGVyKQogICAgICAgIDpvcmlnaW4ob3RoZXIub3JpZ2luKQogICAgICAgIHsKICAgICAgICAJY291dCA8PCAiY21wQnlTbG9wZSBjb3B5ISIgPDwgZW5kbDsKICAgICAgICB9CiAgICAgICAgY21wQnlTbG9wZShQb2ludCYgYSkgOiBvcmlnaW4oYSl7fQogICAgICAgIGJvb2wgb3BlcmF0b3IoKSAoY29uc3QgUG9pbnQqIGxlZnQsY29uc3QgUG9pbnQqIHJpZ2h0KWNvbnN0CiAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbi5zbG9wZVRvKCpsZWZ0KSA8IG9yaWdpbi5zbG9wZVRvKCpyaWdodCk7CiAgICAgICAgfQoKfTsKb3N0cmVhbSYgb3BlcmF0b3I8PCAob3N0cmVhbSYgb3V0LCBjb25zdCBQb2ludCYgcCkKewogICAgY291dCA8PCAiKCIgPDwgcC54IDw8ICIsIiA8PCBwLnkgPDwgIikiIDsKICAgIHJldHVybiBvdXQ7Cn0KCgppbnQgTjsKdmVjdG9yPFBvaW50Kj4gdjsKdm9pZCBjcmVhdGUoKQp7CnYucHVzaF9iYWNrKG5ldyBQb2ludCgyODAwMCwxMDAwKSk7CnYucHVzaF9iYWNrKG5ldyBQb2ludCgyODAwMCw1MDAwKSk7CnYucHVzaF9iYWNrKG5ldyBQb2ludCgyODAwMCwxMzUwMCkpOwp2LnB1c2hfYmFjayhuZXcgUG9pbnQoMjMwMDAsMTYwMDApKTsKdi5wdXNoX2JhY2sobmV3IFBvaW50KDEwMDAsMTgwMDApKTsKdi5wdXNoX2JhY2sobmV3IFBvaW50KDEzMDAwLDIxMDAwKSk7CnYucHVzaF9iYWNrKG5ldyBQb2ludCgyMDAwLDIyMDAwKSk7CnYucHVzaF9iYWNrKG5ldyBQb2ludCgzMDAwLDI2MDAwKSk7CnYucHVzaF9iYWNrKG5ldyBQb2ludCgzNTAwLDI4MDAwKSk7CnYucHVzaF9iYWNrKG5ldyBQb2ludCg0MDAwLDMwMDAwKSk7CiAgICBjb3V0IDw8ICJEdXJpbmcgaW5pdGlhbGl6YXRpb24gOiAiIDw8IHRpbWVzIDw8IGVuZGw7CgogICAgY291dCA8PCAiSW5wdXQgcmVhZGluZyBoYXMgY29tcGxldGUhIiA8PCBlbmRsOwp9CmJvb2wgY21wKGNvbnN0IFBvaW50KiBwLGNvbnN0IFBvaW50KiBxKQp7CiAgICByZXR1cm4gKCpwKTwoKnEpOwp9CmludCBtYWluKHZvaWQpICAgICAgICAKewogICAgY3JlYXRlKCk7CgogICAgaW50IGJlZm9yZSA9IHRpbWVzOwogICAgY291dCA8PCAiU29ydCBieSBuYXR1cmFsIG9yZGVyIDogIjsKICAgIHNvcnQodi5iZWdpbigpLHYuZW5kKCksY21wKTsKICAgIGZvciAoUG9pbnQqIHAgOiB2KQogICAgICAgIGNvdXQgPDwgKnAgPDwgIiAiOwogICAgY291dCA8PCBlbmRsOwogICAgY291dCA8PCAiRHVyaW5nIHNvcmluZyA6ICIgPDwgKHRpbWVzIC0gYmVmb3JlKSA8PCBlbmRsOwoKICAgIGNvdXQgPDwgIlNvcnQgYnkgc2xvcGUgOiAiOwogICAgYmVmb3JlID0gdGltZXM7CiAgICBzb3J0KHYuYmVnaW4oKSx2LmVuZCgpLGNtcEJ5U2xvcGUoKnZbMl0pKTsKICAgIGZvciAoUG9pbnQqIHAgOiB2KQogICAgewogICAgICAgIGNvdXQgPDwgKnAgPDwgIiAiOwogICAgfQogICAgY291dCA8PCBlbmRsOwogICAgY291dCA8PCAiRHVyaW5nIHNvcmluZyA6ICIgPDwgKHRpbWVzIC0gYmVmb3JlKSA8PCBlbmRsOwp9ICAgICAgICAgICAg
During initialization : 0
Input reading has complete!
Sort by natural order : (28000,1000) (28000,5000) (28000,13500) (23000,16000) (1000,18000) (13000,21000) (2000,22000) (3000,26000) (3500,28000) (4000,30000)
During soring : 0
Sort by slope : cmpBySlope copy!
cmpBySlope copy!
cmpBySlope copy!
cmpBySlope copy!
cmpBySlope copy!
cmpBySlope copy!
cmpBySlope copy!
cmpBySlope copy!
cmpBySlope copy!
cmpBySlope copy!
cmpBySlope copy!
(28000,13500) (4000,30000) (3500,28000) (23000,16000) (13000,21000) (3000,26000) (2000,22000) (1000,18000) (28000,1000) (28000,5000)
During soring : 0