Cod sursa(job #2913130)

Utilizator betybety bety bety Data 12 iulie 2022 20:57:41
Problema Triangulare Scor 0
Compilator cpp-64 Status done
Runda Arhiva ICPC Marime 2.85 kb
#include <bits/stdc++.h>
using namespace std;
ifstream in("triangulare.in");
ofstream out("triangulare.out");
typedef long double ld;
typedef pair<int,int> pii;
struct punct
{
    int ind;
    int x,y;
};
vector<punct> v;
vector<pii> ans;
int tst,n;
const ld eps=0.000000001;
const ld dif=0.000001;
bool intersect(punct a,punct b,punct c,punct d)
{
    ld ax=a.x,ay=a.y;
    ld bx=b.x,by=b.y;
    ld cx=c.x,cy=c.y;
    ld dx=d.x,dy=d.y;
    ld mab=(ax-bx)/(ay-by+eps);
    ld mcd=(cx-dx)/(cy-dy+eps);
    if(mab==mcd)
    {
        if((cx-ax)*(dx-ax)>-dif or (cx-bx)*(dx-bx)>-dif or
           (ax-cx)*(bx-cx)>-dif or (ax-dx)*(bx-dx)>-dif)
            return true;
        return false;
    }
    ld y=(ax-cx+cy*mcd-ay*mab)/(mcd-mab);
    if((ay-y)*(by-y)>-dif and (cy-y)*(dy-y)>-dif)
        return true;
    return false;
}
void solve(vector<punct> v)
{
    if(v.size()==3)
        return ;
    int n=v.size();
    int area=v[n-1].x*v[0].y-v[0].x*v[n-1].y;
    for(int i=0;i<n-1;++i)
        area+=v[i].x*v[i+1].y-v[i+1].x*v[i].y;
    area=abs(area);
    for(int i=0;i<n-2;++i)
    for(int j=i+2;j<n;++j)
    if(!(i==0 and j==n-1))
    {
        bool stop=false;
        if(i!=0 and i!=n-1 and j!=0 and j!=n-1 and intersect(v[i],v[j],v[n-1],v[0]))
            continue;
        for(int k=0;k<n-1;++k) if(k!=i and k!=j and k+1!=i and k+1!=j)
        if(intersect(v[i],v[j],v[k],v[k+1]))
        {
            stop=true;
            break;
        }
        if(stop)
            continue;
        int area1=v[j].x*v[i].y-v[i].x*v[j].y;
        for(int k=i;k<j;++k)
            area1+=v[k].x*v[k+1].y-v[k+1].x*v[k].y;
        area1=abs(area1);
        if(area1>area)
            continue;
        int area2=v[n-1].x*v[0].y-v[0].x*v[n-1].y;
        for(int k=0;k<i;++k)
            area2+=v[k].x*v[k+1].y-v[k+1].x*v[k].y;
        area2+=v[i].x*v[j].y-v[j].x*v[i].y;
        for(int k=j;k<n-1;++k)
            area2+=v[k].x*v[k+1].y-v[k+1].x*v[k].y;
        area2=abs(area2);
        if(area!=area1+area2)
            continue;
        ans.push_back({v[i].ind,v[j].ind});
        vector<punct> p1,p2;
        p1.clear(),p2.clear();
        for(int k=i;k<=j;++k)
            p1.push_back(v[k]);
        for(int k=0;k<=i;++k)
            p2.push_back(v[k]);
        for(int k=j;k<n;++k)
            p2.push_back(v[k]);
        solve(p1);
        solve(p2);
        return ;
    }
}
int main()
{
    ios_base::sync_with_stdio(false);
    in.tie(0),out.tie(0);
    in>>tst;
    while(tst--)
    {
        in>>n;
        v.clear();
        v.resize(n);
        for(int i=0;i<n;++i)
            in>>v[i].x>>v[i].y,
            v[i].ind=i;
        ans.clear();
        solve(v);
        sort(ans.begin(),ans.end());
        for(pii p:ans) out<<p.first<<' '<<p.second<<'\n';
        //out<<'\n';
    }
    return 0;
}