백준 28129 - 2022 APC가 어려웠다고요?
위 포스트는 백준 28129 - 2022 APC가 어려웠다고요?의 풀이입니다. dp[i][j] := i번째 수가 j가 되는 경우의 수 dp[i][j]=∑k=max(j−k,a[i−…
2025/03/28
Jinsoolve.
위 포스트는 백준 8872 - 빌라봉 문제의 해설입니다.
위 문제에는 여러 개의 트리가 존재한다.
임의의 2개의 트리를 서로 이을 때 최대 시간이 최소가 되게 하기 위해서는 각 트리의 지름에서 중간점을 찾아, 그 중간점끼리 연결해야 최대시간이 최소가 될 것이다.
또한 각 트리끼리의 이동 시간의 최대시간을 최소로 만들려면 트리의 지름이 가장 큰 애와 나머지 트리를 서로 연결해야 할 것이다.
따라서 정답은 결국 3개 중 하나가 된다. (지름이 가장 긴 순서대로 번호가 매겨졌을 때라 가정하자.)
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(); ll n, m, l; vve<pll> g; ve<bool> vis; ll U, D; void dfs(ll p, ll u, ll d) { vis[u] = true; if(D < d) { U = u; D = d; } for(auto [v,w] : g[u]) { if(v == p) continue; dfs(u, v, d+w); } } ve<pll> route; bool path(ll p, ll u, ll dst) { if(u == dst) { return true; } for(auto [v,w] : g[u]) { if(v == p) continue; route.emplace_back(v, route.back().sd + w); if(path(u,v,dst)) return true; route.pop_back(); } return false; } bool cmp(ll a, ll b) { return a > b; } void solve() { cin >> n >> m >> l; g = vve<pll>(n+1); vis = ve<bool>(n+1, false); while(m--) { ll a, b, t; cin >> a >> b >> t; g[a].emplace_back(b,t); g[b].emplace_back(a,t); } ll ans = 0; ve<ll> maxs; for(int i=0; i<n; i++) { if(vis[i]) continue; D = -1; dfs(i,i,0); ll A = U; D = -1; dfs(A,A,0); ll B = U; ll AB_dist = D; ckmax(ans, AB_dist); route.clear(); route.emplace_back(A,0); path(A,A,B); int j=0; while(j < route.size()-1) { if(max(route[j].sd, AB_dist-route[j].sd) < max(route[j+1].sd, AB_dist-route[j+1].sd)) break; j++; } maxs.emplace_back(max(route[j].sd, AB_dist-route[j].sd)); } sort(all(maxs), cmp); if(maxs.size() >= 2) ckmax(ans, maxs[0] + maxs[1] + l); if(maxs.size() > 2) ckmax(ans, maxs[1] + maxs[2] + l*2); cout << ans << endl; } int main(void) { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); 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
위 포스트는 백준 24979 - COW Operations 에 대한 해설입니다. 아이디어1# 주어진 Operation을 해보면 아래와 같은 변환이 가능하다는 것을 알 수 있다.…
2025/02/28