Cod sursă (job #693827)

Utilizator avatar DKMKD Matei Filibiu DKMKD IP ascuns
Problemă Înfășurătoare convexă Compilator cpp-32 | 2.07 kb
Rundă vaslui_cls1112_07.02 Status evaluat
Dată 7 feb. 2023 20:25:54 Scor 30
#include <bits/stdc++.h>
#include <unordered_map>
#include <map>

using namespace std;

ifstream fin("infasuratoare.in");
ofstream fout("infasuratoare.out");
//-----------------------------------------
#define ll long long
#define pii pair<int, int>
#define pll pair<long long, long long>
#define vi vector<int>
#define vll vector<long long>
#define mii map<int, int>
#define si set<int>
#define sc set<char>
//-----------------------------------------
#define f(i,s,e) for(int i=s;i<=e;++i)
#define nf(i,s,e) for(i=s;i<e;++i)
#define rf(i,e,s) for(i=e;i>=s;--i)
#define pb push_back
#define eb emplace_back
#define fi first
#define se second
#define sp <<" "
//------------------------------------------
const int NMAX = 1e5 + 5;
const int KMAX = 1e1 + 5;
const int MOD = 1e5 + 3;
const int INF = 0x3f3f3f3f;
const int PI = 3.141592654;
//------------------------------------------
struct xy {
    int x, y;
}v[NMAX];
int n;
vector<xy>infs;
//------------------------------------------
void read() {
    fin >> n;
    for (int i = 0; i < n; ++i)
        fin >> v[i].x >> v[i].y;
}
inline int orientare(const xy& a, const xy& b, const xy& c) {
    return (b.y - a.y) * (c.x - b.x) - (b.x - a.x) * (c.y - b.y);
}
bool cmp(const xy& a, const xy& b) {
    return orientare(v[0], a, b) < 0;
}
int find() {
    int j = 0, i;
    for (i = 1; i < n; i++)
        if (v[i].y < v[j].y || (v[j].y == v[i].y && v[i].x < v[j].x))
            j = i;
    return j;
}

void infasuratoare() {
    infs.push_back(v[0]);
    infs.push_back(v[1]);
    for (int i = 2; i < n; i++) {
        while (infs.size() >= 2 && orientare(infs[infs.size() - 2], infs.back(), v[i]) >= 0)
            infs.pop_back();
        infs.push_back(v[i]);
    }
}
void solve() {
    swap(v[0], v[find()]);
    sort(v + 1, v + n, cmp);
    infasuratoare();
    fout << infs.size() << "\n";
    for (const xy &i : infs)
        fout << i.x << " " << i.y << "\n";
}
int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    read();
    solve();
    return 0;
}