Submission #831870

#TimeUsernameProblemLanguageResultExecution timeMemory
831870beaconmcFactories (JOI14_factories)C++14
15 / 100
2919 ms37092 KiB
#include <bits/stdc++.h> //#include <ext/pb_ds/assoc_container.hpp> //#include <ext/pb_ds/tree_policy.hpp> typedef long long ll; using namespace std; //using namespace __gnu_pbds; #define FOR(i, x, y) for(ll i=x; i<y; i++) #define FORNEG(i, x, y) for(ll i=x; i>y; i--) //#define ordered_set tree<ll, null_type,less_equal<ll>, rb_tree_tag,tree_order_statistics_node_update> #define fast() ios_base::sync_with_stdio(false);cin.tie(NULL) #include "factories.h" ll dp[100001]; ll dp2[100001]; ll par[100001]; vector<vector<ll>> edges[100001]; ll n; void Init(int N, int A[], int B[], int D[]) { n = N; FOR(i,0,N) dp[i] = 0,dp2[i] = 0; FOR(i,0,N-1){ edges[B[i]].push_back({A[i], D[i]}); edges[A[i]].push_back({B[i], D[i]}); } } set<ll> first, second; void dfs(ll a, ll p){ par[a] = p; ll ans1 = 1000000000000000; ll ans2 = 1000000000000000; for (auto&i : edges[a]){ if (i[0]==p) continue; dfs(i[0], a); ans1 = min(ans1, dp[i[0]] + i[1]); ans2 = min(ans2, dp2[i[0]] + i[1]); } if (first.count(a)) ans1 = 0; if (second.count(a)) ans2 = 0; dp[a] = ans1; dp2[a] = ans2; } long long Query(int S, int X[], int T, int Y[]) { first.clear(); second.clear(); FOR(i,0,S) first.insert(X[i]); FOR(i,0,T) second.insert(Y[i]); dfs(0, -1); ll ans = 1000000000000000; FOR(i,0,n){ ans = min(ans, dp[i] + dp2[i]); } return ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...