알고리즘/알고리즘 이론, 템플릿

가젯 템플릿

b1ackhand 2023. 6. 18. 21:05
#define _CRT_SECURE_NO_WARNINGS
#include <bits/stdc++.h>

#define rep(i, n) for (int i = 0; i < (int)(n); ++i)
#define rep1(i, n) for (int i = 1; i <= (int)(n); ++i)
#define range(x) begin(x), end(x)
#define sz(x) (int)(x).size()
#define pb push_back
#define x first
#define y second

using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<long long, long long> pll;
typedef vector<int> vi;

const int INF = 987654321;
const double pi = 3.14159265358979;

struct Point {
	double x, y;

	bool operator < (const Point& a)
	{
		if (y == a.y)
			return x < a.x;
		else
			return y < a.y;
	}
};

ll ccw(pll a, pll b, pll c)
{
	ll ret = a.x * b.y + b.x * c.y + c.x * a.y - b.x * a.y - c.x * b.y - a.x * c.y;

	if (ret > 0)
		return 1;
	else if (ret < 0)
		return -1;
	else
		return 0;
}

double dist(Point a, Point b)
{
	return (a.y - b.y) * (a.y - b.y) + (a.x - b.x) * (a.x - b.x);
}


int manhat(int startX, int startY, int endX, int endY)
{
	return abs(startX - endX) + abs(startY - endY);
}

int gcd(int x, int y)
{
	if (y == 0)
		return x;
	else
		return gcd(y, x % y);
}

double round_digit(double num, int d)
{
	double t = pow(10, d - 1);
	return round(num * t) / t;
}

bool crossChk(pll a, pll b, pll c, pll d)
{
	ll abc = ccw(a, b, c);
	ll abd = ccw(a, b, d);
	ll cda = ccw(c, d, a);
	ll cdb = ccw(c, d, b);

	if (abc * abd == 0 && cda * cdb == 0)
	{
		if (a > b)
			swap(a, b);
		if (c > d)
			swap(c, d);

		return a <= d && c <= b;
	}

	return abc * abd <= 0 && cda * cdb <= 0;
}

'알고리즘 > 알고리즘 이론, 템플릿' 카테고리의 다른 글

코포 템플릿  (0) 2023.08.07
분할 정복을 이용한 거듭제곱  (0) 2023.07.17
인접행렬 분할거듭제곱  (0) 2023.06.08
스프라그 그런디  (0) 2023.06.05
이분매칭  (0) 2023.06.02