Pagini recente »
Borderou de evaluare (job #447029)
|
Istoria paginii runda/2024-10-22-clasa-5-tema-11/clasament
|
2017-12-21-test-5-2
|
Borderou de evaluare (job #291275)
|
Cod sursă (job #694422)
Cod sursă (job
#694422)
#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 <<" "
#define A(a,b,c) ((b.x-a.x)*(c.y-a.y)-(c.x-a.x)*(b.y-a.y))
//------------------------------------------
const int NMAX = 12e5 + 5;
const int KMAX = 1e1 + 5;
const int MOD = 1e5 + 3;
const int INF = 0x3f3f3f3f;
const int PI = 3.141592654;
//------------------------------------------
int n, p, i, t, s[NMAX];
struct P {
int x, y;
};
P v[NMAX], r, u[NMAX];
//------------------------------------------
void read() {
fin >> n;
for (p = i = 1; i <= n; ++i)
fin >> v[i].x >> v[i].y, p = v[i].x < v[p].x || (v[i].x == v[p].x && v[i].y < v[p].y) ? i : p;
}
void M(int l, int r){
if (l == r)
return;
int i, j, k, m = (l + r) / 2;
for (M(l, m), M(m + 1, r), i = k = l, j = m + 1; i <= m || j <= r;)
u[k++] = (j > r || (i <= m && A(v[1], v[i], v[j]) < 0)) ? v[i++] : v[j++];
for (i = l; i <= r; ++i)
v[i] = u[i];
}
void solve() {
for (r = v[1], v[1] = v[p], v[p] = r, M(2, n), s[++t] = 1, i = 2; i <= n; ++i) {
for (; t > 1 && A(v[s[t - 1]], v[s[t]], v[i]) > 0; --t);
s[++t] = i;
}
for (fout << t << "\n"; t; --t)
fout << v[s[t]].x << " " << v[s[t]].y << "\n";
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
read();
solve();
return 0;
}