Cod sursă (job #807217)

Utilizator avatar Mihai_999 Diaconeasa Mihai Mihai_999 IP ascuns
Problemă Înfășurătoare convexă Compilator cpp-32 | 1,41 kb
Rundă Arhiva de probleme Status evaluat
Dată 30 ian. 2025 18:32:27 Scor 100

#include <iostream>
#include <fstream>
#include <algorithm>
#define nl '\n'

using namespace std;

ifstream fin("infasuratoare.in");
ofstream fout("infasuratoare.out");

const int NMAX = 100005;

int n, ind = 1;

struct Point
{
    int x, y;
};
Point points[NMAX], st[NMAX];

long long int det(const Point& A, const Point& B, const Point& C)
{
    return 1LL*(A.x-B.x)*(B.y-C.y)-1LL*(A.y-B.y)*(B.x-C.x);
}

long long int dist(const Point& A, const Point& B)
{
    return 1LL*(A.x-B.x)*(A.x-B.x)+1LL*(A.y-B.y)*(A.y-B.y);
}

bool cmp(const Point& A, const Point& B)
{
    long long int x = det(points[1], A, B);
    if (x == 0)
        return dist(points[1], A) < dist(points[1], B);
    return x > 0;
}

int main()
{
    fin >> n;
    for (int i = 1; i <= n; i++)
    {
        int x, y;
        fin >> x >> y;
        points[i] = {x, y};
        if ((points[i].y < points[ind].y) || (points[i].y == points[ind].y && points[i].x < points[ind].x))
            ind = i;
    }
    swap(points[1], points[ind]);
    sort(points+2, points+1+n, cmp);
    st[1] = points[1];
    st[2] = points[2];
    int m = 2;
    for (int i = 3; i <= n; i++)
    {
        while (m >= 2 && det(st[m-1], st[m], points[i]) <= 0)
            m--;
        st[++m] = points[i];
    }
    fout << m << nl;
    for (int i = 1; i <= m; i++)
        fout << st[i].x << ' ' << st[i].y << nl;
    return 0;
}