This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |