Cod sursa(job #3038215)

Utilizator Zed1YasuoAlex Birsan Zed1Yasuo Data 26 martie 2023 22:51:07
Problema Rubarba Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.61 kb
#include <fstream>
#include <algorithm>
#define ll long double
#include <cmath>
#include <vector>
#include <iomanip>
using namespace std;
ifstream f("rubarba.in");
ofstream g("rubarba.out");
int n,m;
const int N=1e5+5;
struct pct
{
    ll x,y;
} a[N];
int conv[N];
bool cmp(pct X,pct Y)
{
    if(X.x==Y.x)
        return X.y<Y.y;
    return X.x<Y.x;
}
int vf;
bool viz[N];
long double dy_left,dy_rgt;
int det(pct A, pct B,pct C)
{
    return (B.x-A.x)*(C.y-A.y)-(C.x-A.x)*(B.y-A.y);
}
pct lft,rgt;
long double dx;
long  distanta(pct A,pct B)
{
    return (A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y);
}
long double get_dist(pct A,pct B,pct C)
{
    ll a=A.y-B.y;
    ll b=B.x-A.x;
    ll c=A.x*(B.y-A.y)-A.y*(B.x-A.x);
    long double DI=abs(a*C.x+b*C.y+c)/sqrt(a*a+b*b);
    long double AB=distanta(A,B);
    long double BC=distanta(B,C);
    long double AC=distanta(A,C);
    if(BC>AC+AB)
    {
        ///cade in stanga
        long double XA=sqrt(AC-DI*DI);
        long double XB=sqrt(BC-DI*DI);
       // g<<XA<<" #@!#!@"<<" "<<C.x<<" "<<C.y<<'\n';
        dy_left=max(dy_left,XA);
    }
    else if(AC>AB+BC)
    {
        long double XA=sqrt(AC-DI*DI);
        long double XB=sqrt(BC-DI*DI);
        dy_rgt=max(dy_rgt,XB);
      //  g<<XB<<"dfd"<<" "<<C.x<<" "<<C.y<<'\n';
    }
    return DI;
}
int main()
{
    f>>n;
    for(int i=1; i<=n; i++)
        f>>a[i].x>>a[i].y;
    sort(a+1,a+n+1,cmp);
    conv[++vf]=1;
    conv[++vf]=2;
    viz[2]=true;
    for(int i=3; i<=n; i++)
    {
        while(vf>1&&det(a[conv[vf-1]],a[conv[vf]],a[i])<=0)
        {
            viz[conv[vf]]=false;
            vf--;
        }
        conv[++vf]=i;
        viz[i]=true;
    }
    for(int i=n-1; i>=1; i--)
    {
        if(viz[i]==false)
        {
            while(vf>1&&det(a[conv[vf-1]],a[conv[vf]],a[i])<=0)
            {
                viz[conv[vf]]=false;
                vf--;
            }
            conv[++vf]=i;
            viz[i]=true;
        }
    }
    long double MIN=1e14;
    for(int i=1; i<vf; i++)
    {
        lft=a[conv[i]];
        rgt=a[conv[i+1]];
        dx=0;
        dy_left=0;
        dy_rgt=0;
        for(int j=1; j<vf; j++)
        {
          //  g<<a[i].x<<" "<<a[i].y<<"   "<<a[i+1].x<<" "<<a[i+1].y<<"   ";
          //  g<<a[j].x<<" "<<a[j].y<<"     ";
          //  g<<get_dist(a[i],a[i+1],a[j])<<'\n';
             dx=max(dx,get_dist(a[conv[i]],a[conv[i+1]],a[conv[j]]));
        }
        MIN=min(MIN,dx*(dy_left+dy_rgt+sqrt(distanta(a[conv[i]],a[conv[i+1]]))));
    }
    g<<fixed<<setprecision(5)<<MIN;
    return 0;
}