Submission #552739

#TimeUsernameProblemLanguageResultExecution timeMemory
552739HanksburgerFactories (JOI14_factories)C++17
33 / 100
8099 ms177984 KiB
#include "factories.h" #include <bits/stdc++.h> using namespace std; long long par[20][500005], dist[500005], depth[500005], mp[500005], exist[500005], d[500005], cnt, sz; vector<pair<long long, long long> > adj[500005]; priority_queue<pair<long long, long long> > pq; vector<long long> vec, vec2, vec3; bool visited[500005]; long long lca(long long u, long long v) { if (depth[u]>depth[v]) swap(u, v); long long cur=depth[v]-depth[u]; for (long long i=19; i>=0; i--) if (cur&(1<<i)) v=par[i][v]; if (u==v) return u; for (long long i=19; i>=0; i--) { if (par[i][u]!=par[i][v]) { u=par[i][u]; v=par[i][v]; } } return par[0][u]; } void dfs(long long u, long long p, long long dis, long long dep) { mp[u]=cnt; cnt++; par[0][mp[u]]=mp[p]; dist[mp[u]]=dis; depth[mp[u]]=dep; for (long long i=0; i<adj[u].size(); i++) { long long v=adj[u][i].first, w=adj[u][i].second; if (v!=p) dfs(v, u, dis+w, dep+1); } } void dfs2(long long ind) { long long u=vec3[ind]; while (cnt<sz && lca(u, vec3[cnt])==u) { long long v=vec3[cnt]; long long w=dist[v]-dist[u]; adj[u].push_back({v, w}); adj[v].push_back({u, w}); cnt++; dfs2(cnt-1); } } void Init(int N, int A[], int B[], int D[]) { for (long long i=0; i<=N-2; i++) { adj[A[i]].push_back({B[i], D[i]}); adj[B[i]].push_back({A[i], D[i]}); } dfs(0, 0, 0, 0); for (long long i=1; i<=19; i++) for (long long j=0; j<N; j++) par[i][j]=par[i-1][par[i-1][j]]; for (long long i=0; i<N; i++) adj[i].clear(); } long long Query(int S, int X[], int T, int Y[]) { // cout << "Query\n"; vec.clear(); vec2.clear(); vec3.clear(); for (long long i=0; i<S; i++) { X[i]=mp[X[i]]; vec.push_back(X[i]); } for (long long i=0; i<T; i++) { Y[i]=mp[Y[i]]; vec.push_back(Y[i]); } sort(vec.begin(), vec.end()); for (long long i=0; i<=vec.size()-2; i++) { vec2.push_back(lca(vec[i], vec[i+1])); exist[vec2[i]]=i+1; } for (long long i=0; i<=vec.size()-2; i++) { if (!exist[vec[i]]) { vec3.push_back(vec[i]); vec3.push_back(vec2[i]); } else if (exist[vec[i]]==i+1) vec3.push_back(vec[i]); } vec3.push_back(vec[vec.size()-1]); sort(vec3.begin(), vec3.end()); for (long long i=0; i<vec2.size(); i++) exist[vec2[i]]=0; /* cout << "vec: "; for (long long i=0; i<vec.size(); i++) cout << vec[i] << ' '; cout << '\n'; cout << "vec2: "; for (long long i=0; i<vec2.size(); i++) cout << vec2[i] << ' '; cout << '\n'; cout << "vec3: "; for (long long i=0; i<vec3.size(); i++) cout << vec3[i] << ' '; cout << '\n'; */ sz=vec3.size(); cnt=1; dfs2(0); /* for (long long i=0; i<vec3.size(); i++) { cout << "adj " << vec3[i] << ": "; for (long long j=0; j<adj[vec3[i]].size(); j++) cout << adj[vec3[i]][j].first << ' '; cout << '\n'; } */ for (long long i=0; i<sz; i++) { d[vec3[i]]=1e18; visited[vec3[i]]=0; } for (long long i=0; i<S; i++) { d[X[i]]=0; pq.push({0, X[i]}); } while (!pq.empty()) { long long u=pq.top().second; pq.pop(); if (visited[u]) continue; visited[u]=1; for (long long i=0; i<adj[u].size(); i++) { long long v=adj[u][i].first, w=adj[u][i].second; if (d[v]>d[u]+w) { d[v]=d[u]+w; pq.push({-d[v], v}); } } } long long ans=1e18; for (long long i=0; i<T; i++) ans=min(ans, d[Y[i]]); for (long long i=0; i<sz; i++) adj[vec3[i]].clear(); return ans; }

Compilation message (stderr)

factories.cpp: In function 'void dfs(long long int, long long int, long long int, long long int)':
factories.cpp:36:23: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   36 |  for (long long i=0; i<adj[u].size(); i++)
      |                      ~^~~~~~~~~~~~~~
factories.cpp: In function 'long long int Query(int, int*, int, int*)':
factories.cpp:87:23: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   87 |  for (long long i=0; i<=vec.size()-2; i++)
      |                      ~^~~~~~~~~~~~~~
factories.cpp:92:23: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   92 |  for (long long i=0; i<=vec.size()-2; i++)
      |                      ~^~~~~~~~~~~~~~
factories.cpp:104:23: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  104 |  for (long long i=0; i<vec2.size(); i++)
      |                      ~^~~~~~~~~~~~
factories.cpp:145:24: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  145 |   for (long long i=0; i<adj[u].size(); i++)
      |                       ~^~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...