제출 #119616

#제출 시각아이디문제언어결과실행 시간메모리
119616davitmargTriangles (CEOI18_tri)C++17
100 / 100
64 ms3820 KiB
/*DavitMarg*/
#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <string>
#include <cstring>
#include <map>
#include <set>
#include <queue>
#include <iomanip>
#include <stack>
#include <cassert>
#include <iterator>
#include <bitset>
#include <fstream>
#define death
#ifndef death
#include<trilib.h>
#endif // death

#define mod 1000000007ll
#define LL long long
#define LD long double
#define MP make_pair
#define PB push_back
#define all(v) v.begin(),v.end()
using namespace std;


struct pt
{
	LL x, y;
	pt(LL X = 0, LL Y = 0)
	{
		x = X;
		y = Y;
	}
};

#ifdef death

int get_n()
{
	int x;
	cin >> x;
	return x;
}

vector<pair<LL, LL>> point;

bool is_clockwise(int a, int b, int c)
{
	return 0;
}

void give_answer(int x)
{
	cout << x << endl;
}

#endif // death

map<pair<int, pair<int, int>>, bool> used, pre;

bool cw(pt a, pt b, pt c) {
	return a.x * (b.y - c.y) + b.x * (c.y - a.y) + c.x * (a.y - b.y) < 0;
}

bool ccw(pt a, pt b, pt c) {
	return a.x * (b.y - c.y) + b.x * (c.y - a.y) + c.x * (a.y - b.y) > 0;
}

int ans, n;
vector<pt> p;

int convex_hull(vector<pt> a) {
	sort(a.begin(), a.end(), [](pt a, pt b) {
		if (a.x == b.x)
			return a.x < b.x;
		return a.y < b.y;
	});
	pt p1 = a[0], p2 = a.back();
	vector<pt> up, down;
	up.push_back(p1);
	down.push_back(p1);
	for (size_t i = 1; i < a.size(); ++i) {
		if (i == a.size() - 1 || cw(p1, a[i], p2)) {
			while (up.size() >= 2 && !cw(up[up.size() - 2], up[up.size() - 1], a[i]))
				up.pop_back();
			up.push_back(a[i]);
		}
		if (i == a.size() - 1 || ccw(p1, a[i], p2)) {
			while (down.size() >= 2 && !ccw(down[down.size() - 2], down[down.size() - 1], a[i]))
				down.pop_back();
			down.push_back(a[i]);
		}
	}
	a.clear();
	for (size_t i = 0; i < up.size(); ++i)
		a.push_back(up[i]);
	for (size_t i = down.size() - 2; i > 0; --i)
		a.push_back(down[i]);
	return a.size();
}

int main()
{
	n = get_n();

#ifdef death
	point.PB(MP(0, 0));
	for (int i = 0; i < n; i++)
	{
		LL x, y;
		cin >> x >> y;
		p.PB(pt(x, y));
	}
#endif // death

	ans = convex_hull(p);

	give_answer(ans);

	return 0;
}


/*


4
5 10
0 0
4 3
10 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...