#include <bits/stdc++.h>
#include "closing.h"
using namespace std;
using ll = long long;
const int mxN = 2e5+10;
array<ll, 2> d[mxN];
vector<array<ll, 2>> adj[mxN];
bitset<mxN> assigned;
array<bool, 2> vis[mxN];
ll val[mxN];
void dfs(int node, int p, int flag) {
for(auto [it, dist] : adj[node]) {
if(it == p) continue;
d[it][flag] = d[node][flag]+dist;
dfs(it, node, flag);
}
}
int max_score(int N, int X, int Y, ll K, vector<int> U, vector<int> V, vector<int> W) {
int ans = 0, n = N;
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]});
}
d[X][0] = 0; dfs(X, -1, 0);
d[Y][1] = 0; dfs(Y, -1, 1);
set<array<int, 3>> s;
s.insert({0, X, 0}); s.insert({0, Y, 1});
for(auto [it, dist] : adj[X]) {
s.insert({dist, it, 0});
vis[it][0] = true;
}
vis[X][0] = true; vis[Y][1] = true;
for(auto [it, dist] : adj[Y]) {
s.insert({dist, it, 1});
vis[it][1] = true;
}
while(K > 0 && !s.empty()) {
array<int, 3> curr = *(s.begin());
int dist = curr[0], u = curr[1], flag = curr[2];
if(K < dist) break;
K -= dist;
++ans;
s.erase(s.begin());
if(!assigned[u]) {
assigned[u] = true;
val[u] = dist;
auto it = s.lower_bound({d[u][1-flag], u, 1-flag});
if(it != s.end() && (*it)[1] == u) {
array<int, 3> now = {(*it)[0]-dist, u, 1-flag};
s.erase(it);
s.insert(now);
}
}
for(auto [it, _] : adj[u]) {
if(!vis[it][flag]) {
vis[it][flag] = true;
if(assigned[it]) {
s.insert({d[it][flag]-val[it], it, flag});
}
else {
s.insert({d[it][flag], it, flag});
}
}
}
}
for(int i = 0; i < n; i++) {
adj[i].clear();
assigned[i] = false;
val[i] = 0; vis[i][0] = 0; vis[i][1] = 0;
d[i][0] = 0; d[i][1] = 0;
}
return ans;
}
/*int main()
{
vector<int> a = {0, 0, 1, 2, 2, 5}, b = {1, 3, 2, 4, 5, 6}, c = {2, 3, 4, 2, 5, 3};
cout << max_score(7, 0, 2, 10, a, b, c) << ' ';
vector<int> d = {0, 1, 2}, e = {1, 2, 3}, f = {18, 1, 19};
cout << max_score(4, 0, 3, 20, d, e, f);
}*/
Compilation message (stderr)
closing.cpp: In function 'int max_score(int, int, int, ll, std::vector<int>, std::vector<int>, std::vector<int>)':
closing.cpp:33:19: warning: narrowing conversion of 'dist' from 'std::tuple_element<1, std::array<long long int, 2> >::type' {aka 'long long int'} to 'int' [-Wnarrowing]
33 | s.insert({dist, it, 0});
| ^~~~
closing.cpp:33:25: warning: narrowing conversion of 'it' from 'std::tuple_element<0, std::array<long long int, 2> >::type' {aka 'long long int'} to 'int' [-Wnarrowing]
33 | s.insert({dist, it, 0});
| ^~
closing.cpp:38:19: warning: narrowing conversion of 'dist' from 'std::tuple_element<1, std::array<long long int, 2> >::type' {aka 'long long int'} to 'int' [-Wnarrowing]
38 | s.insert({dist, it, 1});
| ^~~~
closing.cpp:38:25: warning: narrowing conversion of 'it' from 'std::tuple_element<0, std::array<long long int, 2> >::type' {aka 'long long int'} to 'int' [-Wnarrowing]
38 | s.insert({dist, it, 1});
| ^~
closing.cpp:51:36: warning: narrowing conversion of 'd[u].std::array<long long int, 2>::operator[](((std::array<long long int, 2>::size_type)(1 - flag)))' from 'std::array<long long int, 2>::value_type' {aka 'long long int'} to 'int' [-Wnarrowing]
51 | auto it = s.lower_bound({d[u][1-flag], u, 1-flag});
| ~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
closing.cpp:62:42: warning: narrowing conversion of '(d[it].std::array<long long int, 2>::operator[](((std::array<long long int, 2>::size_type)flag)) - val[it])' from 'std::array<long long int, 2>::value_type' {aka 'long long int'} to 'int' [-Wnarrowing]
62 | s.insert({d[it][flag]-val[it], it, flag});
closing.cpp:62:52: warning: narrowing conversion of 'it' from 'std::tuple_element<0, std::array<long long int, 2> >::type' {aka 'long long int'} to 'int' [-Wnarrowing]
62 | s.insert({d[it][flag]-val[it], it, flag});
| ^~
closing.cpp:65:29: warning: narrowing conversion of 'd[it].std::array<long long int, 2>::operator[](((std::array<long long int, 2>::size_type)flag))' from 'std::array<long long int, 2>::value_type' {aka 'long long int'} to 'int' [-Wnarrowing]
65 | s.insert({d[it][flag], it, flag});
| ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
closing.cpp:65:44: warning: narrowing conversion of 'it' from 'std::tuple_element<0, std::array<long long int, 2> >::type' {aka 'long long int'} to 'int' [-Wnarrowing]
65 | s.insert({d[it][flag], it, flag});
| ^~
# | 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... |