Pagini recente »
Diferențe pentru runda/tema15-seniori-2014-2015 între reviziile 1 și 2
|
Monitorul de evaluare
|
Istoria paginii utilizator/andreistreche
|
Istoria paginii runda/informatica_distractiva_runda_1/clasament
|
Cod sursă (job #816375)
Cod sursă (job
#816375)
#include <fstream>
#include <algorithm>
#include <iomanip>
using namespace std;
ifstream cin("infasuratoare.in");
ofstream cout("infasuratoare.out");
struct pnt
{
int x;
int y;
} p[100001];
pnt stiva[100001];
int top = 0;
int cross_prod(pnt a, pnt b, pnt c)
{
int delta = (b.x - a.x) * (c.y - a.y) - (b.y - a.y) * (c.x - a.x);
if (delta > 0)
{
return 1; /// trig
}
else if (delta == 0)
{
return 0; /// col
}
else if (delta < 0)
{
return -1; /// clockwise
}
}
bool cmp(pnt a, pnt b)
{
return cross_prod(p[1], a, b) > 0;
}
int main()
{
int n;
cin >> n;
int mini = 1;
for (int i = 1; i <= n; i ++)
{
cin >> p[i].x >> p[i].y;
if (p[i].y < p[mini].y)
{
mini = i;
}
else if (p[i].y == p[mini].y)
{
if (p[i].x < p[mini].x)
{
mini = i;
}
}
}
swap(p[mini], p[1]);
sort(p + 2, p + n + 1, cmp);
top ++;
stiva[top] = p[1];
top ++;
stiva[top] = p[2];
for (int i = 3; i <= n; i ++)
{
if (cross_prod(stiva[top - 1], stiva[top], p[i]) >= 0 || top == 1)
{
top ++;
stiva[top] = p[i];
}
else
{
while (cross_prod(stiva[top - 1], stiva[top], p[i]) == -1)
{
top --;
}
top ++;
stiva[top] = p[i];
}
}
cout << top << "\n";
for (int i = 1; i <= top; i ++)
{
cout << stiva[i].x << " " << stiva[i].y << "\n";
}
return 0;
}