Pagini recente » Cod sursa (job #38400) | Cod sursa (job #279335) | Cod sursa (job #1596256) | Cod sursa (job #1457057) | Cod sursa (job #1923082)
#include <bits/stdc++.h>
#define x first
#define y second
using namespace std;
ifstream fin("infasuratoare.in");
ofstream fout("infasuratoare.out");
typedef pair <double, double> Point;
const int MAXN = 120010;
const int EPS = 1e-12;
int n;
Point v[MAXN];
bool vis[MAXN];
int st[MAXN], head;
void read()
{
fin >> n;
for(int i=1; i<=n; ++i)
fin >> v[i].x >> v[i].y;
}
double cross_product(Point O, Point A, Point B){
return (A.x - O.x) * (B.y - O.y) - (B.x - O.x) * (A.y - O.y); /// determinantul (Aria)
}
void convex_hull()
{
/// sortam dupa x
sort(v+1, v+n+1);
/// este stiva mea de puncte din infasuratoare
st[1] = 1; st[2] = 2; head = 2;
///introducem primele 2 elemente in infasuratoare si setam numarul de elemente din stiva
vis[2] = 1;
///marcam 2 ca fiind vizitat
for (int i = 1, p = 1; i > 0; i += (p = (i == n ? -p : p))) ///i este indicele nodului la care ma aflu, p este pasul, pozitiv sau negatv
{
if(vis[i]) continue;
/// daca a fost vizitat nu l vizitam
while(head >= 2 && cross_product(v[st[head-1]], v[st[head]], v[i]) <= EPS)
///cat timp directia este schimbata
vis[st[head--]] = 0;
st[++head] = i;
vis[i] = 1;
}
///scriem solutie
fout<<head - 1<<'\n';
fout<<setprecision(6)<<fixed;
for(int i=1; i < head; ++i)
fout<<v[st[i]].x<<' '<<v[st[i]].y<<'\n';
}
int main()
{
read();
convex_hull();
return 0;
}