Pagini recente »
Cod sursă (job #308248)
|
Borderou de evaluare (job #653669)
|
Cod sursă (job #811989)
|
Cod sursă (job #720047)
|
Cod sursă (job #676642)
Cod sursă (job
#676642)
#include <fstream>
#include <iostream>
#include <algorithm>
using namespace std;
ifstream f("infasuratoare.in");
ofstream g("infasuratoare.out");
struct point
{
long long x, y;
bool operator < (const point &that) const
{
return (y < that.y) || (y == that.y && x < that.x);
}
};
int n, m;
int st[100005];
point v[100005];
long long cross_product(const point& a, const point& b, const point& c)
{
return (b.x - a.x) * (c.y - a.y) - (b.y - a.y) * (c.x - a.x);
}
bool cmp(const point& a, const point& b)
{
return cross_product(v[1], a, b) < 0;
}
int main()
{
f >> n;
for (int i = 1; i <= n; i++)
f >> v[i].x >> v[i].y;
for (int i = 2; i <= n; i++)
if ((v[i].x < v[1].x) || (v[1].x == v[i].x && v[i].y < v[1].y))
swap(v[i], v[1]);
sort(v + 2, v + n + 1, cmp);
// cout << "in_x = np.array(["; for (int i = 1; i <= n; i++) cout << v[i].x << ", "; cout << "])\n";
// cout << "in_y = np.array(["; for (int i = 1; i <= n; i++) cout << v[i].y << ", "; cout << "])\n";
// cout << cross_product(v[n-1], v[1], v[n]);
m = 2;
st[1] = 1;
st[2] = 2;
for (int i = 3; i <= n; i++)
{
while (m > 2 && cross_product(v[st[m - 1]], v[st[m]], v[i]) >= 0)
m--;
m++;
st[m] = i;
}
while (cross_product(v[1], v[st[m]], v[st[m-1]]) == 0)
m--;
int start = m;
for (int i = 1; i <= m; i++)
if (v[st[i]] < v[st[start]])
start = i;
cout << v[st[start]].x << ' ' << v[st[start]].y << '\n';
g << m << "\n";
for (int i = start; i >= 1; i--)
g << v[st[i]].x << " " << v[st[i]].y << "\n";
for (int i = m; i > start; i--)
g << v[st[i]].x << " " << v[st[i]].y << "\n";
// for (int i = m; i >= 1; i--)
// g << v[st[i]].x << " " << v[st[i]].y << "\n";
return 0;
}