Cod sursă (job #817800)

Utilizator avatar Radu_Tanase Tanase Radu Mihai Radu_Tanase IP ascuns
Problemă Înfășurătoare convexă Compilator cpp-32 | 1,83 kb
Rundă Arhiva de probleme Status evaluat
Dată 2 apr. 2025 22:31:02 Scor 100
#include <bits/stdc++.h>

using namespace std;

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

struct pnt
{
    long long x;
    long long y;
} v[100001];

pnt stiva[100001];
long long varf = 0;

long long cross_prod(pnt a, pnt b, pnt c)
{
    long long delta = (b.x - a.x) * (c.y - a.y) - (b.y - a.y) * (c.x - a.x);

    if (delta > 0)
        return 1;

    else if (delta == 0)
        return 0;

    else if (delta < 0)
        return -1;

}

long long dist(pnt a, pnt b)
{
    return (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y);
}

bool cmp(pnt a, pnt b)
{
    if (cross_prod(v[1], a, b) > 0)
        return true;

    else if (cross_prod(v[1], a, b) == 0)
        return dist(v[1], a) < dist(v[1], b);

    else
        return false;

}

int main()
{
    long long n;

    fin >> n;

    long long mini = 1;
    for (long long i = 1; i <= n; i ++)
    {
        fin >> v[i].x >> v[i].y;

        if (v[i].y < v[mini].y)
            mini = i;

        else if (v[i].y == v[mini].y)
            if (v[i].x < v[mini].x)
            {
                mini = i;
            }
    }
    swap(v[mini], v[1]);
    sort(v + 2, v + n + 1, cmp);

    varf ++;
    stiva[varf] = v[1];
    varf ++;
    stiva[varf] = v[2];

    for (long long i = 3; i <= n; i ++)
    {
        if (cross_prod(stiva[varf - 1], stiva[varf], v[i]) > 0 || varf == 1)
        {
            varf ++;
            stiva[varf] = v[i];
        }
        else
        {
            while (cross_prod(stiva[varf - 1], stiva[varf], v[i]) <= 0 && varf > 1)
                varf --;

            varf ++;
            stiva[varf] = v[i];
        }
    }
    fout << varf << "\n";

    for (long long i = 1; i <= varf; i ++)
        fout << stiva[i].x << " " << stiva[i].y << "\n";

}