이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#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;
priority_queue<array<ll, 2>, vector<array<ll, 2>>, greater<array<ll, 2>>> pq2;
auto getnext = [&](auto u, auto start){
array<ll, 3> best = {ll(1e9)};
for(auto [v, _]:g[u]){
if(vis[start^1][v] and c[start^1][v] <= c[start][v]){
if(not vis[start][v])
best = min(best, {c[start][v] - c[start^1][v], v, start});
}else{
if(not vis[start][v])
best = min(best, {c[start][v], v, start});
}
}
return best;
};
auto visite = [&](auto u, auto start, ll cost){
assert(vis[start][u]==0);
if(cost>K) return;
vis[start][u]=1;
cerr << u << " " << start << " " << cost << " " << K << endl;
K -= cost;
ans++;
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});
}
if(vis[start^1][u]){
pq2.push({max(c[0][v], c[1][v]), v});
}
}
};
for(int u=X; ; u=par[u]){
if(min(c[0][u], c[1][u])>K){
return ans;
}
if(c[0][u]<c[1][u]){
visite(u, 0, c[0][u]);
}else{
visite(u, 1, c[1][u]);
}
if(u==Y) break;
}
while(pq.size() or pq2.size()){
vector<array<ll, 3>> todo;
array<ll, 2> cur = {-1, -1};
while(pq.size() and todo.size()<2){
auto [cost, u, start] = pq.top();
pq.pop();
if(vis[start][u]){
continue;
}
todo.push_back({cost, u, start});
}
while(pq2.size() and cur[0]==-1){
auto [cost, u]=pq2.top();
pq2.pop();
if(vis[0][u] or vis[1][u]) continue;
cur = {cost, u};
}
// todo.size() == 1
// todo.size() == 0
// todo.size() == 2
if(todo.size()==0 and cur[0]!=-1 and K>=cur[0]){
visite(cur[1], 0, cur[0]);
visite(cur[1], 1, 0);
}if(todo.size()==1){
if(cur[0]==-1){
visite(todo[0][1], todo[0][2], todo[0][0]);
}else{
auto v = getnext(todo[0][1], todo[0][2]);
if(todo[0][0] + v[0] < cur[0] or cur[0]>K){
visite(todo[0][1], todo[0][2], todo[0][0]);
pq2.push(cur);
}else if(cur[0]<=K){
visite(cur[1], 0, cur[0]);
visite(cur[1], 1, 0);
pq.push(todo[0]);
}
}
}if(todo.size()==2){
if(cur[0]==-1){
visite(todo[0][1], todo[0][2], todo[0][0]);
pq.push(todo[1]);
}else{
auto v = getnext(todo[0][1], todo[0][2]);
if(todo[0][0] + min(v[0], todo[1][0]) < cur[0] or cur[0]>K){
visite(todo[0][1], todo[0][2], todo[0][0]);
pq.push(todo[1]);
pq2.push(cur);
}else if(cur[0]<=K){
visite(cur[1], 0, cur[0]);
visite(cur[1], 1, 0);
pq.push(todo[0]);
pq.push(todo[1]);
}
}
}
}
return ans;
};
return max(get(K), get2(K));
}
# | 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... |