백준 28129 - 2022 APC가 어려웠다고요?
위 포스트는 백준 28129 - 2022 APC가 어려웠다고요?의 풀이입니다. dp[i][j] := i번째 수가 j가 되는 경우의 수 dp[i][j]=∑k=max(j−k,a[i−…
2025/03/28
NEW POST
Jinsoolve.
껍질에 있는 점들을 대상으로 임의의 대각선에 대해서 해당 대각선에서 가장 먼 점 2개를 고르면 해당 대각선으로 만들 수 있는 가장 큰 영역이다. 이때 먼점 2개는 대각선을 기준으로 서로 다른 영역에 있음을 가정한다.
cpp#include <bits/stdc++.h> #define endl "\n" #define all(v) (v).begin(), (v).end() #define all1(v) (v).begin()+1, (v).end() #define For(i, a, b) for(int i=(a); i<(b); i++) #define FOR(i, a, b) for(int i=(a); i<=(b); i++) #define Bor(i, a, b) for(int i=(a)-1; i>=(b); i--) #define BOR(i, a, b) for(int i=(a); i>=(b); i--) #define ft first #define sd second using namespace std; using ll = long long; using lll = __int128_t; using ulll = __uint128_t; using ull = unsigned long long; using ld = long double; using pii = pair<int, int>; using pll = pair<ll, ll>; using ti3 = tuple<int, int, int>; using tl3 = tuple<ll, ll, ll>; template<typename T> using ve = vector<T>; template<typename T> using vve = vector<vector<T>>; template<class T> bool ckmin(T& a, const T& b) { return b < a ? a = b, 1 : 0; } template<class T> bool ckmax(T& a, const T& b) { return a < b ? a = b, 1 : 0; } const int INF = 987654321; const int INF0 = numeric_limits<int>::max(); const ll LNF = 987654321987654321; const ll LNF0 = numeric_limits<ll>::max(); struct Point { ll x, y; Point() {} Point(ll _x, ll _y) : x(_x), y(_y) {} ll cross(Point other) { return x*other.y - y*other.x; } ll crossSign(Point other) { ll res = this->cross(other); if(res > 0) return 1; else if(res < 0) return -1; return 0; } ll dist(Point other) { return pow(x-other.x,2) + pow(y-other.y,2); } Point operator-(Point other) const { return Point(x-other.x, y-other.y); } bool operator==(Point other) const { return x == other.x && y == other.y; } bool operator<(Point other) const { if(x == other.x) return y < other.y; return x < other.x; } void print() { cout << x << ' ' << y << ' '; } }; Point reference; vector<Point> Graham_Scan(vector<Point> &points) { sort(all(points)); points.erase(unique(all(points)), points.end()); reference = points[0]; auto cmp = [&](Point a, Point b) { ll res = (a - reference).cross(b - reference); if(res != 0) return res > 0; return reference.dist(a) < reference.dist(b); }; sort(points.begin()+1, points.end(), cmp); vector<Point> convex; for(Point p3 : points) { while(convex.size() >= 2) { Point p2 = convex.back(); Point p1 = convex[convex.size() - 2]; ll ccw = (p2-p1).cross(p3-p2); if(ccw > 0) break; convex.pop_back(); } convex.emplace_back(p3); } return convex; } ll triangle(Point &p1, Point &p2, Point &p3) { ll res = abs(p1.x*p2.y + p2.x*p3.y + p3.x*p1.y - p2.x*p1.y - p3.x*p2.y - p1.x*p3.y); // if(res % 2 == 0) return (ld)((ll)(res/2)); // return (ld)((ll)(res/2) + 0.5); return res; } int n; ve<Point> v; void solve() { cin >> n; ve<Point>tmp(n); For(i,0,n) cin >> tmp[i].x >> tmp[i].y; v = Graham_Scan(tmp); // for(auto x:v) { // x.print(); // cout << endl; // } n = v.size(); if(n == 3) { ll res = triangle(v[0], v[1], v[2]); if(res%2 == 0) cout << res/2 << endl; else cout << res/2 << ".5\n"; return; } ll ret = 0; For(i,0,n) { int a=(i+1)%n, b=(i+3)%n; For(j, i+2, n) { while(true) { int na = (a+1)%n; if(na == j) break; if(triangle(v[i], v[j], v[a]) < triangle(v[i], v[j], v[na])) a = na; else break; } while(true) { int nb = (b+1)%n; if(nb == i) break; if(triangle(v[i],v[j],v[b]) < triangle(v[i],v[j],v[nb])) b = nb; else break; } ckmax(ret, triangle(v[i],v[j],v[a]) + triangle(v[i],v[j],v[b])); } } if(ret%2 == 0) cout << ret/2 << endl; else cout << ret/2 << ".5\n"; } int main(void) { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); cout << fixed << setprecision(1); int TC=1; cin >> TC; FOR(tc, 1, TC) { // cout << "Case #" << tc << ": "; solve(); } return 0; }
위 포스트는 백준 28129 - 2022 APC가 어려웠다고요?의 풀이입니다. dp[i][j] := i번째 수가 j가 되는 경우의 수 dp[i][j]=∑k=max(j−k,a[i−…
2025/03/28
위 포스트는 백준 1055 - 끝이없음의 해 설입니다. 문자열이 재귀적으로 반복하는 것을 알 수 있다. 이때 min과 max의 차이가 최대 100개 정도임을 알 수 있고, 우리는…
2025/03/05
위 포스트는 백준 1787 - 문자열의 주기 예측 의 해설입니다. 결국 부분 문자열에서 가장 짧으면서 일치하는 Prefix와 Suffix를 찾으면 된다. (해당 길이를 전체…
2025/03/05
위 포스트는 백준 8872 - 빌라봉 문제의 해설입니다. 위 문제에는 여러 개의 트리가 존재한다. 임의의 2개의 트리를 서로 이을 때 최대 시간이 최소가 되게 하기 위해서는 각…
2025/03/04