Cod sursa(job #3299465)

Utilizator David_RadavoiRadavoi David Alexandru David_Radavoi Data 6 iunie 2025 20:05:13
Problema Infasuratoare convexa Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.29 kb
#include <iostream>
#include <algorithm>

using namespace std;

#define MAXN 120000

struct infasor
{
    float x, y;
}v[MAXN + 1];

int stiva[MAXN + 1];
int stiva2[MAXN + 1];

int formula(int a, int b, int c)
{
    return v[a].x * v[b].y + v[b].x * v[c].y + v[c].x * v[a].y - v[b].y * v[c].x - v[c].y * v[a].x - v[a].y * v[b].x;
}

bool cmp(infasor a, infasor b)
{
    if (a.x < b.x)
    {
        return true;
    }
    if (a.x == b.x && a.y < b.y)
    {
        return true;
    }
    return false;
}

int main()
{
    FILE *fin, *fout;
    fin = fopen("infasuratoare.in", "r");
    fout = fopen("infasuratoare.out", "w");
    int N, i, vf, mini, maxi, vf2;
    fscanf(fin, "%d", &N);
    for (i = 1; i <= N; i++)
    {
        fscanf(fin, "%f%f", &v[i].x, &v[i].y);
    }
    sort(v + 1, v + N + 1, cmp);
    for (i = 1; i <= N; i++)
    {
        if (i == 1)
        {
            mini = maxi = 1;
        }
        else
        {
            if (v[mini].y > v[i].y || (v[mini].y == v[i].y && v[mini].x > v[i].x))
            {
                mini = i;
            }
            if (v[maxi].y < v[i].y || (v[maxi].y == v[i].y && v[maxi].x < v[i].x))
            {
                maxi = i;
            }
        }
    }
    vf = 0;
    stiva[0] = mini;
    for (i = 1; i <= N; i++)
    {
        if (i != mini && i != maxi && 0 > formula(mini, maxi, i))
        {
            while (vf > 0 && formula(stiva[vf - 1], i, stiva[vf]) > 0)
            {
                vf--;
            }
            stiva[++vf] = i;
        }
    }
    vf2 = 0;
    stiva2[0] = maxi;
    for (i = N; i >= 1; i--)
    {
        if (i != mini && i != maxi && 0 < formula(mini, maxi, i))
        {
            while (vf2 > 0 && formula(stiva2[vf2 - 1], i, stiva2[vf2]) > 0)
            {
                vf2--;
            }
            stiva2[++vf2] = i;
        }
    }
    fprintf(fout, "%d\n%f %f\n", vf + vf2 + 2, v[mini].x, v[mini].y);
    for (i = 1; i <= vf; i++)
    {
        fprintf(fout, "%f %f\n", v[stiva[i]].x, v[stiva[i]].y);
    }
    fprintf(fout, "%f %f\n", v[maxi].x, v[maxi].y);
    for (i = 1; i <= vf2; i++)
    {
        fprintf(fout, "%f %f\n", v[stiva2[i]].x, v[stiva2[i]].y);
    }
    fclose(fin);
    fclose(fout);
    return 0;
}