Cod sursa(job #2766468)

Utilizator loraclorac lorac lorac Data 1 august 2021 20:33:32
Problema Triangulare Scor 0
Compilator cpp-64 Status done
Runda Arhiva ICPC Marime 2.49 kb
#include <bits/stdc++.h>
using namespace std;
ifstream in("triangulare.in");
ofstream out("triangulare.out");
struct point
{
    int ind;
    int x,y;
}v[55],init[55];
int tst,n;
int sgn(int x)
{
    if(x<0) return -1;
    if(x==0) return 0;
    return 1;
}
int dist(point a,point b)
{
    return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
}
bool mycmp(point a,point b)
{
    return ((a.y-v[0].y)*(b.x-v[0].x)<(b.y-v[0].y)*(a.x-v[0].x) or
            ((a.y-v[0].y)*(b.x-v[0].x)==(b.y-v[0].y)*(a.x-v[0].x) and dist(v[0],a)<dist(v[0],b)));
}
int compare(point a,point b,point c)
{
    return sgn((a.y-c.y)*(b.x-c.x)-(b.y-c.y)*(a.x-c.x));
}
int unde[55];
void arange(vector<int> &ordine,int minim)
{
    vector<int> nou;
    for(int i=unde[minim];i<ordine.size();++i)
        nou.push_back(ordine[i]);
    for(int i=0;i<unde[minim];++i)
        nou.push_back(ordine[i]);
    swap(nou,ordine);
    nou.clear();
    for(int i=0;i<ordine.size();++i)
        unde[ordine[i]]=i;
}
vector<pair<int,int> > edge;
void solve(vector<int> ordine,int inferior)
{
    if(ordine.size()==3)
        return ;
    int minim=60;
    for(int x:ordine)
    if(x>inferior)
        minim=min(minim,x);
    arange(ordine,minim);
    int per=60,uu=-1;
    for(int i=2;i<ordine.size()-1;++i)
    if(ordine[i]<per and compare(init[ordine[0]],init[ordine[1]],init[ordine[i]])!=0)
        per=ordine[i],uu=i;
    if(per==60)
    {
        solve(ordine,minim);
        return ;
    }
    vector<int> parte;
    edge.push_back({ordine[0],ordine[uu]});
    for(int i=0;i<=uu;++i)
        parte.push_back(ordine[i]);
    solve(parte,-1);
    parte.clear();
    parte.push_back(ordine[0]);
    for(int i=uu;i<ordine.size();++i)
        parte.push_back(ordine[i]);
    solve(parte,-1);
}
int main()
{
    in>>tst;
    while(tst--)
    {
        in>>n;
        for(int i=0;i<n;++i)
            in>>v[i].x>>v[i].y,v[i].ind=i,init[i]=v[i];
        for(int i=1;i<n;++i)
        {
            if(v[i].x<v[0].x) swap(v[0],v[i]);
            else if(v[i].x==v[0].x and v[i].y<v[0].y) swap(v[0],v[i]);
        }
        sort(v+1,v+n,mycmp);
        vector<int> ordine;
        for(int i=0;i<n;++i)
            unde[v[i].ind]=i,// cout<<v[i].ind<<' ',
            ordine.push_back(v[i].ind);
        solve(ordine,-1);
        sort(edge.begin(),edge.end());
        for(auto p:edge)
            out<<p.first<<' '<<p.second<<'\n';
        edge.clear();
        // cout<<'\n';
    }
    return 0;
}