Submission #1269189

#TimeUsernameProblemLanguageResultExecution timeMemory
1269189repmannFactories (JOI14_factories)C++20
0 / 100
8076 ms589824 KiB
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int N;
bool V[500001];
int SIZE[500001];
vector <pair <int, int>> VG[500001];
vector <pair <ll, int>> UP[500001];
ll DP[500001];
inline int SDFS(int node, int parent = -1)
{
  SIZE[node] = 1;
  for(pair <int, int> p : VG[node]) if(!V[p.second] && (p.second != parent)) SIZE[node] += SDFS(p.second, node);
  return SIZE[node];
}
inline int CDFS(int node, int num, int parent = -1)
{
  int temp = 0;
  for(pair <int, int> p : VG[node]) if((!V[p.second] && (p.second != parent)) && (SIZE[p.second] > SIZE[temp])) temp = p.second;
  if(SIZE[temp] <= num) return temp;
  return CDFS(temp, num, node);
}
inline void DFS(int node, int root, ll depth, int parent = -1)
{
  UP[node].push_back({depth, root});
  for(pair <int, int> p : VG[node]) if(!V[p.second] && (p.second != parent)) DFS(p.second, root, depth + p.first, node);
  return;
}
inline void CD(int root = 1)
{
  SDFS(root);
  int centroid = CDFS(root, (SIZE[root] + 1) >> 1);
  DFS(centroid, centroid, 0);
  V[centroid] = 1;
  for(pair <int, int> p : VG[centroid]) if(!V[p.second]) CD(p.second);
  return;
}
void Init(int n, int u[], int v[], int w[])
{
  N = n;
  for(int i = 0; i < (N - 1); i++)
  {
    VG[u[i] + 1].push_back({w[i], v[i] + 1});
    VG[v[i] + 1].push_back({w[i], u[i] + 1});
  }
  CD();
  for(int i = 1; i <= N; i++) DP[i] = 1e18;
  return;
}
ll Query(int n, int X[], int m, int Y[])
{
  ll ret = 1e18;
  for(int i = 0; i < n; i++) for(pair <ll, int> p : UP[X[i] + 1]) DP[p.second] = min(p.first, DP[p.second]);
  for(int i = 0; i < m; i++) for(pair <ll, int> p : UP[Y[i] + 1]) ret = min(p.first + DP[p.second], ret);
  for(int i = 0; i < n; i++) for(pair <ll, int> p : UP[X[i] + 1]) DP[p.second] = 1e18;
  return ret;
}
//int main()
//{
//  int n, m;
//  cin >> n;
//  int u[n], v[n], w[n];
//  for(int i = 0; i < (n - 1); i++) cin >> u[i] >> v[i] >> w[i];
//  Init(n, u, v, w);
//  while(true)
//  {
//    cin >> n >> m;
//    int x[n], y[m];
//    for(int i = 0; i < n; i++) cin >> x[i];
//    for(int i = 0; i < m; i++) cin >> y[i];
//    cout << "ans: " << Query(n, x, m, y) << '\n';
//  }
//
//  return 0;
//}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...