Submission #1219577

#TimeUsernameProblemLanguageResultExecution timeMemory
121957712345678Portal (BOI24_portal)C++20
100 / 100
39 ms4032 KiB
#include <bits/stdc++.h>

using namespace std;

#define ll long long

mt19937 rng(time(0));

const int nx=1e5+5;

ll n, x[nx], y[nx];

struct myvector
{
    ll x, y;
    myvector(ll x=0, ll y=0): x(x), y(y){}
    bool operator< (const myvector &o) const {return 1;}
};
vector<myvector> v;

ll cross(myvector a, myvector b)
{
    return a.x*b.y-a.y*b.x;
}

myvector merge(myvector a, myvector b)
{
    return myvector(__gcd(a.x, b.x), __gcd(a.y, b.y));
}

int main()
{
    cin.tie(NULL)->sync_with_stdio(false);
    cin>>n;
    for (int i=1; i<=n; i++) cin>>x[i]>>y[i];
    for (int i=2; i<=n; i++) v.push_back(myvector(x[i]-x[1], y[i]-y[1]));
    while (v.size()>=3)
    {
        auto a=v.back();
        v.pop_back();
        auto b=v.back();
        v.pop_back();
        auto c=v.back();
        v.pop_back();
        if (cross(a, b)==0) v.push_back(merge(a, b)), v.push_back(c);
        else if (cross(b, c)==0) v.push_back(merge(b, c)), v.push_back(a);
        else if (cross(a, c)==0) v.push_back(merge(a, c)), v.push_back(b);
        else
        {
            vector<pair<ll, myvector>> tmp={{rng(), a}, {rng(), b}, {rng(), c}};
            sort(tmp.begin(), tmp.end());
            a=tmp[0].second;
            b=tmp[1].second;
            c=tmp[2].second;
            ll k=(b.y*c.x-b.x*c.y)/(b.y*a.x-b.x*a.y);
            ll l=(a.y*c.x-a.x*c.y)/(a.y*b.x-a.x*b.y);
            c.x-=k*a.x+l*b.x;
            c.y-=k*a.y+l*b.y;
            v.push_back(a);
            v.push_back(b);
            v.push_back(c);
        }
    }
    if (v.size()<=1||(v.size()==2&&cross(v[0], v[1])==0)) cout<<-1;
    else cout<<abs(cross(v[0], v[1]));
}

/*
3
1 2
4 1
0 0

*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...