#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+OjppbmZpbml0eSgpOwogICAgICAgICAgICBpZiAoeSA9PSB0aGF0LnkpIHJldHVybiAwOwogICAgICAgICAgICByZXR1cm4gKHRoYXQueSAtIHkpIC8gKGRvdWJsZSkodGhhdC54IC0geCk7CiAgICAgICAgfQogICAgICAgIGJvb2wgb3BlcmF0b3I8IChjb25zdCBQb2ludCYgdGhhdCljb25zdAogICAgICAgIHsKCiAgICAgICAgICAgIGlmICh5IDwgdGhhdC55KSByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgaWYgKHkgPT0gdGhhdC55ICYmIHggPCB0aGF0LngpIHJldHVybiB0cnVlOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgZnJpZW5kIG9zdHJlYW0mIG9wZXJhdG9yPDwgKG9zdHJlYW0mLCBjb25zdCBQb2ludCYgcCk7Cn07CgpjbGFzcyBjbXBCeVNsb3BlCnsKICAgIHByaXZhdGU6CiAgICAgICAgUG9pbnQgb3JpZ2luOwogICAgcHVibGljOgogICAgICAgIGNtcEJ5U2xvcGUoY29uc3QgY21wQnlTbG9wZSYgb3RoZXIpCiAgICAgICAgOm9yaWdpbihvdGhlci5vcmlnaW4pCiAgICAgICAgewogICAgICAgIAljb3V0IDw8ICJjbXBCeVNsb3BlIGNvcHkhIiA8PCBlbmRsOwogICAgICAgIH0KICAgICAgICBjbXBCeVNsb3BlKFBvaW50JiBhKSA6IG9yaWdpbihhKXt9CiAgICAgICAgYm9vbCBvcGVyYXRvcigpIChjb25zdCBQb2ludCogbGVmdCxjb25zdCBQb2ludCogcmlnaHQpY29uc3QKICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ2luLnNsb3BlVG8oKmxlZnQpIDwgb3JpZ2luLnNsb3BlVG8oKnJpZ2h0KTsKICAgICAgICB9Cgp9Owpvc3RyZWFtJiBvcGVyYXRvcjw8IChvc3RyZWFtJiBvdXQsIGNvbnN0IFBvaW50JiBwKQp7CiAgICBjb3V0IDw8ICIoIiA8PCBwLnggPDwgIiwiIDw8IHAueSA8PCAiKSIgOwogICAgcmV0dXJuIG91dDsKfQoKCmludCBOOwp2ZWN0b3I8UG9pbnQqPiB2Owp2b2lkIGNyZWF0ZSgpCnsKdi5wdXNoX2JhY2sobmV3IFBvaW50KDI4MDAwLDEwMDApKTsKdi5wdXNoX2JhY2sobmV3IFBvaW50KDI4MDAwLDUwMDApKTsKdi5wdXNoX2JhY2sobmV3IFBvaW50KDI4MDAwLDEzNTAwKSk7CnYucHVzaF9iYWNrKG5ldyBQb2ludCgyMzAwMCwxNjAwMCkpOwp2LnB1c2hfYmFjayhuZXcgUG9pbnQoMTAwMCwxODAwMCkpOwp2LnB1c2hfYmFjayhuZXcgUG9pbnQoMTMwMDAsMjEwMDApKTsKdi5wdXNoX2JhY2sobmV3IFBvaW50KDIwMDAsMjIwMDApKTsKdi5wdXNoX2JhY2sobmV3IFBvaW50KDMwMDAsMjYwMDApKTsKdi5wdXNoX2JhY2sobmV3IFBvaW50KDM1MDAsMjgwMDApKTsKdi5wdXNoX2JhY2sobmV3IFBvaW50KDQwMDAsMzAwMDApKTsKICAgIGNvdXQgPDwgIkR1cmluZyBpbml0aWFsaXphdGlvbiA6ICIgPDwgdGltZXMgPDwgZW5kbDsKCiAgICBjb3V0IDw8ICJJbnB1dCByZWFkaW5nIGhhcyBjb21wbGV0ZSEiIDw8IGVuZGw7Cn0KYm9vbCBjbXAoY29uc3QgUG9pbnQqIHAsY29uc3QgUG9pbnQqIHEpCnsKICAgIHJldHVybiAoKnApPCgqcSk7Cn0KaW50IG1haW4odm9pZCkgICAgICAgIAp7CiAgICBjcmVhdGUoKTsKCiAgICBpbnQgYmVmb3JlID0gdGltZXM7CiAgICBjb3V0IDw8ICJTb3J0IGJ5IG5hdHVyYWwgb3JkZXIgOiAiOwogICAgc29ydCh2LmJlZ2luKCksdi5lbmQoKSxjbXApOwogICAgZm9yIChQb2ludCogcCA6IHYpCiAgICAgICAgY291dCA8PCAqcCA8PCAiICI7CiAgICBjb3V0IDw8IGVuZGw7CiAgICBjb3V0IDw8ICJEdXJpbmcgc29yaW5nIDogIiA8PCAodGltZXMgLSBiZWZvcmUpIDw8IGVuZGw7CgogICAgY291dCA8PCAiU29ydCBieSBzbG9wZSA6ICI7CiAgICBiZWZvcmUgPSB0aW1lczsKICAgIHNvcnQodi5iZWdpbigpLHYuZW5kKCksY21wQnlTbG9wZSgqdlsyXSkpOwogICAgZm9yIChQb2ludCogcCA6IHYpCiAgICB7CiAgICAgICAgY291dCA8PCAqcCA8PCAiICI7CiAgICB9CiAgICBjb3V0IDw8IGVuZGw7CiAgICBjb3V0IDw8ICJEdXJpbmcgc29yaW5nIDogIiA8PCAodGltZXMgLSBiZWZvcmUpIDw8IGVuZGw7Cn0gICAgICAgICAgICA=
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 : copying28000,13500
copying28000,13500
cmpBySlope copy!
copying28000,13500
cmpBySlope copy!
copying28000,13500
cmpBySlope copy!
copying28000,13500
cmpBySlope copy!
copying28000,13500
cmpBySlope copy!
copying28000,13500
cmpBySlope copy!
copying28000,13500
cmpBySlope copy!
copying28000,13500
cmpBySlope copy!
copying28000,13500
cmpBySlope copy!
copying28000,13500
cmpBySlope copy!
copying28000,13500
cmpBySlope copy!
(28000,13500) (4000,30000) (3500,28000) (23000,16000) (13000,21000) (3000,26000) (2000,22000) (1000,18000) (28000,1000) (28000,5000)
During soring : 12