제출 #993980

#제출 시각아이디문제언어결과실행 시간메모리
993980aaaaaarroz봉쇄 시간 (IOI23_closing)C++17
8 / 100
300 ms60496 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; vector<vector<pair<ll,ll>>>graph; vector<bool> vis; void dfs(vector<ll> &dist, int x, ll d){ vis[x] = true; dist[x] = d; for (auto [y, w] : graph[x]){ if (!vis[y]){ dfs(dist, y, d + w); } } } int max_score(int N, int X, int Y, ll K, vector<int> U, vector<int> V, vector<int> W){ graph.assign(N,vector<pair<ll,ll>>()); for(int i=0;i<(N-1);i++){ graph[U[i]].push_back({V[i],W[i]}); graph[V[i]].push_back({U[i],W[i]}); } //Calculo de distancia. vis.assign(N,false); vector<ll>distX(N); dfs(distX,X,0); vis.assign(N,false); vector<ll>distY(N); dfs(distY,Y,0); vector<ll>closing(N,0); set<tuple<ll,ll,ll>>prioridad; for(int i=0;i<N;i++){ prioridad.insert({distX[i],i,0}); } for(int i=0;i<N;i++){ prioridad.insert({distY[i],i,1}); } int ans=0; vector<bool>v(N,false); while(!prioridad.empty()){ auto[peso,nodo,from]=*prioridad.begin(); prioridad.erase(prioridad.begin()); if(K>=peso){ K-=peso; closing[nodo]+=peso; if(from==0&&!v[nodo]){ prioridad.erase({distY[nodo],nodo,1}); prioridad.insert({distY[nodo]-peso,nodo,1}); } else if(from==1&&!v[nodo]){ prioridad.erase({distX[nodo],nodo,0}); prioridad.insert({distX[nodo]-peso,nodo,0}); } v[nodo]=true; ans++; } } return ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...