Submission #842467

#TimeUsernameProblemLanguageResultExecution timeMemory
842467omeganotClosing Time (IOI23_closing)C++17
75 / 100
1054 ms578448 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; const int MOD = 1E9 + 7; const int INF = 1E9; const ll INFLL = 1E18; void dfs(int x, vector<vector<array<int, 2>>>& adj, vector<ll>& w, int p) { for(array<int, 2> i : adj[x]) { if(i[0] != p) { w[i[0]] = w[x] + i[1]; dfs(i[0], adj, w, x); } } } vector<array<ll, 4>> merge(vector<array<ll, 4>> dp, vector<array<ll, 4>> dp2) { vector<array<ll, 4>> dp3(dp.size() + dp2.size() - 1, {INFLL, INFLL, INFLL, INFLL}); for(int i = 0; i < dp.size(); i++) { for(int j = 0; j < dp2.size(); j++) { for(int k = 0; k < 4; k++) { if(dp[i][k] == INFLL) { continue; } for(int l = 0; l < 4; l++) { if((k & l) == l) { dp3[i + j][k] = min(dp3[i + j][k], dp[i][k] + dp2[j][l]); } } } } } return dp3; } vector<array<ll, 4>> merge2(vector<array<ll, 4>> dp, vector<array<ll, 4>> dp2) { vector<array<ll, 4>> dp3(dp.size() + dp2.size() - 1, {INFLL, INFLL, INFLL, INFLL}); for(int i = 0; i < dp.size(); i++) { for(int j = 0; j < dp2.size(); j++) { for(int k = 0; k < 4; k++) { if(dp[i][k] == INFLL) { continue; } for(int l = 0; l < 4; l++) { if((k & 1) >= (l & 1) && (l & 2) >= (k & 2)) { dp3[i + j][k] = min(dp3[i + j][k], dp[i][k] + dp2[j][l]); } } } } } return dp3; } void dfs2(int x, vector<vector<array<int, 2>>>& adj, vector<ll>& wX, vector<ll>& wY, vector<vector<array<ll, 4>>>& dp, int p) { array<int, 4> force = {0, 0, 0, 0}; if(p != -1) { force[1] = 1; force[3] = 1; if(wY[p] < wY[x]) { force[2] = 2; force[3] |= 2; } } dp[x].resize(3); dp[x][0] = {0, INFLL, INFLL, INFLL}; dp[x][1] = {INFLL, wX[x], wY[x], INFLL}; dp[x][2] = {INFLL, INFLL, INFLL, max(wX[x], wY[x])}; for(array<int, 2> i : adj[x]) { if(i[0] != p) { dfs2(i[0], adj, wX, wY, dp, x); if(wY[i[0]] >= wY[x]) { dp[x] = merge(dp[x], dp[i[0]]); } else { dp[x] = merge2(dp[x], dp[i[0]]); } } } } int max_score(int N, int X, int Y, ll K, vector<int> U, vector<int> V, vector<int> W) { vector<vector<array<int, 2>>> adj(N); for(int i = 0; i + 1 < N; i++) { adj[U[i]].push_back({V[i], W[i]}); adj[V[i]].push_back({U[i], W[i]}); } vector<ll> wX(N + 1); vector<ll> wY(N + 1); dfs(X, adj, wX, -1); dfs(Y, adj, wY, -1); vector<vector<array<ll, 4>>> dp(N); dfs2(X, adj, wX, wY, dp, -1); for(int i = 2 * N; i >= 2; i--) { if(min(dp[X][i][1], dp[X][i][3]) <= K) { return i; } } return 0; }

Compilation message (stderr)

closing.cpp: In function 'std::vector<std::array<long long int, 4> > merge(std::vector<std::array<long long int, 4> >, std::vector<std::array<long long int, 4> >)':
closing.cpp:20:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::array<long long int, 4> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   20 |  for(int i = 0; i < dp.size(); i++) {
      |                 ~~^~~~~~~~~~~
closing.cpp:21:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::array<long long int, 4> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   21 |   for(int j = 0; j < dp2.size(); j++) {
      |                  ~~^~~~~~~~~~~~
closing.cpp: In function 'std::vector<std::array<long long int, 4> > merge2(std::vector<std::array<long long int, 4> >, std::vector<std::array<long long int, 4> >)':
closing.cpp:39:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::array<long long int, 4> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   39 |  for(int i = 0; i < dp.size(); i++) {
      |                 ~~^~~~~~~~~~~
closing.cpp:40:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::array<long long int, 4> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   40 |   for(int j = 0; j < dp2.size(); j++) {
      |                  ~~^~~~~~~~~~~~
#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...