#include "closing.h"
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int max_score(int N, int X, int Y, long long K, vector<int> U, vector<int> V, vector<int> W){
vector<vector<array<int, 2>>> g(N);
vector c(2, vector<ll>(N));
vector<int> par(N);
for(int i=0; i<N-1; i++){
g[U[i]].push_back({V[i], W[i]});
g[V[i]].push_back({U[i], W[i]});
}
function<void(int, int, vector<ll>&)> dfs = [&](int u, int p, vector<ll> &c){
par[u] = p;
for(auto [v, cost]:g[u]){
if(v==p){
continue;
}
c[v]+=c[u] + cost;
dfs(v, u, c);
}
};
dfs(X, -1, c[0]);
dfs(Y, -1, c[1]);
auto get = [&](ll K){
int ans = 0;
vector vis(2, vector<int>(N));
priority_queue<array<ll, 3>, vector<array<ll, 3>>, greater<array<ll, 3>>> pq;
// (cost, node, start x or y)
pq.push({0, X, 0});
pq.push({0, Y, 1});
while(pq.size()){
auto [cost, u, start] = pq.top();
pq.pop();
if(vis[start][u]){
continue;
}
vis[start][u]=1;
if(K<cost){
break;
}
//cerr << u << " " << cost << " " << start << endl;
ans++;
K-=cost;
for(auto [v, _]:g[u]){
pq.push({c[start][v], v, start});
}
}
return ans;
};
auto get2 = [&](ll K){
int ans = 0;
vector vis(2, vector<int>(N));
priority_queue<array<ll, 3>, vector<array<ll, 3>>, greater<array<ll, 3>>> pq;
for(int u=X; ; u=par[u]){
if(min(c[0][u], c[1][u])>K){
return ans;
}
ans++;
if(c[0][u]<c[1][u]){
K-=c[0][u];
vis[0][u]=1;
}else{
K-=c[1][u];
vis[1][u]=1;
}
if(u==Y) break;
}
for(int u=X; u!=Y; u=par[u]){
for(int start=0; start<2; start++){
for(auto [v, _]:g[u]){
if(vis[start^1][v] and c[start^1][v] <= c[start][v]){
pq.push({c[start][v] - c[start^1][v], v, start});
}else{
pq.push({c[start][v], v, start});
}
if(vis[start^1][v] and c[start^1][u] >= c[start][u]){
pq.push({c[start^1][u] - c[start][u], u, start^1});
}
}
}
}
while(pq.size()){
auto [cost, u, start] = pq.top();
pq.pop();
if(vis[start][u]){
continue;
}
vis[start][u]=1;
if(K<cost){
break;
}
ans++;
K-=cost;
for(auto [v, _]:g[u]){
if(vis[start^1][v] and c[start^1][v] <= c[start][v]){
pq.push({c[start][v] - c[start^1][v], v, start});
}else{
pq.push({c[start][v], v, start});
}
if(vis[start^1][v] and c[start^1][u] >= c[start][u]){
pq.push({c[start^1][u] - c[start][u], u, start^1});
}
}
}
return ans;
};
return max(get(K), get2(K));
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
0 ms |
348 KB |
1st lines differ - on the 1st token, expected: '6', found: '5' |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
75 ms |
29900 KB |
Output is correct |
2 |
Correct |
89 ms |
36652 KB |
Output is correct |
3 |
Correct |
52 ms |
2908 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
348 KB |
Output is correct |
2 |
Incorrect |
0 ms |
348 KB |
1st lines differ - on the 1st token, expected: '30', found: '24' |
3 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
348 KB |
Output is correct |
2 |
Incorrect |
0 ms |
348 KB |
1st lines differ - on the 1st token, expected: '30', found: '24' |
3 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
348 KB |
Output is correct |
2 |
Incorrect |
0 ms |
348 KB |
1st lines differ - on the 1st token, expected: '30', found: '24' |
3 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
0 ms |
348 KB |
1st lines differ - on the 1st token, expected: '6', found: '5' |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
0 ms |
348 KB |
1st lines differ - on the 1st token, expected: '6', found: '5' |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
0 ms |
348 KB |
1st lines differ - on the 1st token, expected: '6', found: '5' |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
0 ms |
348 KB |
1st lines differ - on the 1st token, expected: '6', found: '5' |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
0 ms |
348 KB |
1st lines differ - on the 1st token, expected: '6', found: '5' |
2 |
Halted |
0 ms |
0 KB |
- |