제출 #847693

#제출 시각아이디문제언어결과실행 시간메모리
847693TheMiraiTraveller0711봉쇄 시간 (IOI23_closing)C++17
8 / 100
168 ms251108 KiB
#include "closing.h" #include <bits/stdc++.h> // #include <vector> using namespace std; using ll = long long; // Subtask Checker class CheckSub1 { private: vector<vector<pair<int, ll>>> adj; vector<bool> vis; vector<ll> dist; void DFS(int u, ll dd) { vis[u] = 1; dist[u] = dd; for (auto [v, w] : adj[u]) { if (vis[v]) continue; DFS(v, dd + w); } } public: bool isSub1(int N, int X, int Y, long long K, vector<int> U, vector<int> V, vector<int> W) { adj.resize(N + 3); dist.resize(N + 3); vis.assign(N + 3, 0); for (int i = 0; i < N - 1; i++) { adj[U[i]].push_back({V[i], W[i]}); adj[V[i]].push_back({U[i], W[i]}); } DFS(X, 0); return (dist[Y] > 2 * K); } }; /* Subtask 1 : */ class Subtask1 { private: vector<vector<pair<int, ll>>> adj; vector<bool> vis; void DFS(int u, ll dd, vector<ll> &dist) { vis[u] = 1; dist[u] = dd; for (auto [v, w] : adj[u]) { if (vis[v]) continue; DFS(v, dd + w, dist); } } public: int getsol(int N, int X, int Y, long long K, vector<int> U, vector<int> V, vector<int> W) { adj.resize(N + 3); for (int i = 0; i < N - 1; i++) { adj[U[i]].push_back({V[i], W[i]}); adj[V[i]].push_back({U[i], W[i]}); } vector<ll> dist1(N + 3); vis.assign(N + 3, 0); DFS(X, 0, dist1); vector<ll> dist2(N + 3); vis.assign(N + 3, 0); DFS(Y, 0, dist2); vector<ll> adist; for (int i = 0; i < N; i++) { adist.push_back(dist1[i]); adist.push_back(dist2[i]); } sort(adist.begin(), adist.end()); int pt = 0, ans = 0; ll cost = 0; while (pt < adist.size() && cost + adist[pt] <= K) { cost += adist[pt]; pt++, ans++; } return ans; } }; // Subtask2-8 class Subtask2 { private: vector<vector<pair<int, ll>>> adj; vector<bool> vis; void DFS(int u, ll dd, vector<ll> &dist, vector<int> &trace) { vis[u] = 1; dist[u] = dd; for (auto [v, w] : adj[u]) { if (vis[v]) continue; trace[v] = u; DFS(v, dd + w, dist, trace); } } public: int getsol(int N, int X, int Y, long long K, vector<int> U, vector<int> V, vector<int> W) { adj.resize(N + 3); for (int i = 0; i < N - 1; i++) { adj[U[i]].push_back({V[i], W[i]}); adj[V[i]].push_back({U[i], W[i]}); } if (X > Y) swap(X, Y); vector<ll> dist1(N + 3); vector<int> trace1(N + 3); vis.assign(N + 3, 0); DFS(X, 0, dist1, trace1); vector<ll> dist2(N + 3); vector<int> trace2(N + 3); vis.assign(N + 3, 0); DFS(Y, 0, dist2, trace2); Subtask1 solver; ll ans = solver.getsol(N, X, Y, K, U, V, W); vector<bool> pth(N + 3, 0); int gg = Y; while (gg != X) { pth[gg] = 1; gg = trace1[gg]; } vector<vector<ll>> dp(4000, vector<ll>(8000, 1e18)); dp[0][0] = 0; for (int i = 0; i < N; i++) for (int j = 0; j <= i * 2; j++) { if (pth[i]) dp[i + 1][j] = min(dp[i + 1][j], dp[i][j]); dp[i + 1][j + 1] = min(dp[i + 1][j + 1], dp[i][j] + min(dist1[i], dist2[i])); dp[i + 1][j + 2] = min(dp[i + 1][j + 2], dp[i][j] + max(dist1[i], dist2[i])); } for (int i = 0; i < 2 * N; i++) { if (dp[N][i] <= K) ans = max(ans, (ll)(i)); } return ans; } }; int max_score(int N, int X, int Y, long long K, std::vector<int> U, std::vector<int> V, std::vector<int> W) { CheckSub1 check; bool isSub1 = check.isSub1(N, X, Y, K, U, V, W); if (isSub1) { Subtask1 sub1; return sub1.getsol(N, X, Y, K, U, V, W); } else if (N <= 3000 && !isSub1) { Subtask2 sub2; return sub2.getsol(N, X, Y, K, U, V, W); } }

컴파일 시 표준 에러 (stderr) 메시지

closing.cpp: In member function 'int Subtask1::getsol(int, int, int, long long int, std::vector<int>, std::vector<int>, std::vector<int>)':
closing.cpp:91:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   91 |         while (pt < adist.size() && cost + adist[pt] <= K)
      |                ~~~^~~~~~~~~~~~~~
closing.cpp: In function 'int max_score(int, int, int, long long int, std::vector<int>, std::vector<int>, std::vector<int>)':
closing.cpp:176:15: warning: control reaches end of non-void function [-Wreturn-type]
  176 |     CheckSub1 check;
      |               ^~~~~
#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...
#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...