제출 #1332450

#제출 시각아이디문제언어결과실행 시간메모리
1332450rana_azka공장들 (JOI14_factories)C++20
15 / 100
8090 ms54656 KiB
#include "factories.h"
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#pragma GCC optimize(03)
// #pragma GCC target("avx2")

const ll INF = 1e18;
const int MAXN = 5e5;
const int MAXLog = log2(MAXN) + 1;

int n, m;
vector<pair<int, ll>> adj[MAXN+5];
ll dist[MAXN+5];

void Init(int N, int A[], int B[], int D[]) {
  n = N;
  for(int i = 1; i <= n-1; i++){
    int u = A[i-1] + 1, v = B[i-1] + 1, w = D[i-1];
    adj[u].push_back({v, w});
    adj[v].push_back({u, w});
  }
}

long long Query(int S, int X[], int T, int Y[]) {
  for(int i = 1; i <= n; i++) dist[i] = INF;
  
  priority_queue<pair<ll, int>, vector<pair<ll, int>>, greater<pair<ll, int>>> dijkstra;
  for(int i = 0; i < S; i++) dijkstra.push({0ll, X[i] + 1});
  while(!dijkstra.empty()){
    auto [curDist, cur] = dijkstra.top();
    dijkstra.pop();
    // cerr << "cur : " << cur << " -> " << curDist << endl;
    
    if(dist[cur] <= curDist) continue;
    dist[cur] = curDist;
    
    for(auto [next, weight] : adj[cur]){
      if(dist[next] <= dist[cur] + weight) continue;
      // cerr << "next : " << next << endl;
      dijkstra.push({dist[cur] + weight, next});
    }
  }
  
  ll ans = INF;
  for(int i = 0; i < T; i++) ans = min(dist[Y[i] + 1], ans);
  
  return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...