Submission #35350

#TimeUsernameProblemLanguageResultExecution timeMemory
35350UncleGrandpa925Factories (JOI14_factories)C++14
15 / 100
6000 ms160784 KiB
#ifndef UncleGrandpa #include "factories.h" #endif #include <bits/stdc++.h> using namespace std; #define sp ' ' #define endl '\n' #define fi first #define se second #define mp make_pair #define bit(x,y) ((x>>y)&1LL) #define N 500005 ostream& operator << (ostream &os, vector<int>&x) { for (int i = 0; i < x.size(); i++) os << x[i] << sp; return os; } ostream& operator << (ostream &os, pair<int, int> x) { cout << x.fi << sp << x.se << sp; return os; } ostream& operator << (ostream &os, vector<pair<int, int> >&x) { for (int i = 0; i < x.size(); i++) os << x[i] << endl; return os; } #define ll long long vector<vector<pair<int, int> > > a(N); ll n; int par[N][22]; int depth[N]; ll dis[N]; int sta[N], en[N]; int Time = 0; void dfs(int u, int p) { par[u][0] = p; Time++; sta[u] = Time; for (int i = 0; i < a[u].size(); i++) { int v = a[u][i].fi; if (v != p) { depth[v] = depth[u] + 1; dis[v] = dis[u] + a[u][i].se; dfs(v, u); } } en[u] = ++Time; } int lca(int p, int q) { if (depth[p] < depth[q]) swap(p, q); for (int i = 20; i >= 0; i--) { if (depth[par[p][i]] >= depth[q]) { p = par[p][i]; } } if (p == q) return p; for (int i = 20; i >= 0; i--) { if (par[p][i] != par[q][i]) { p = par[p][i]; q = par[q][i]; } } return par[p][0]; } ll lcadis(int u, int v) { return abs(dis[u] - dis[v]); } ll distance(int u, int v) { int p = lca(u, v); return dis[u] - dis[p] + dis[v] - dis[p]; } void makelca() { dfs(1, 1); for (int i = 1; i <= 20; i++) { for (int j = 1; j <= n; j++) { par[j][i] = par[par[j][i - 1]][i - 1]; } } } void Init(int _N, int _A[], int _B[], int _D[]) { n = _N; for (int i = 0; i < n; i++) { int u = _A[i]; int v = _B[i]; int c = _D[i]; u++; v++; a[u].push_back(mp(v, c)); a[v].push_back(mp(u, c)); } makelca(); } vector < vector<pair<int, ll> > > b(N); vector<int> allVertex; stack<int> st; bool byEuler(int u, int v) { return sta[u] < sta[v]; } void makeEdge() { sort(allVertex.begin(), allVertex.end(), byEuler); int sz = allVertex.size(); for (int i = 1; i < sz; i++) { int u = allVertex[i - 1]; int v = allVertex[i]; int p = lca(u, v); allVertex.push_back(p); } sort(allVertex.begin(), allVertex.end(), byEuler); allVertex.resize(distance(allVertex.begin(), unique(allVertex.begin(), allVertex.end()))); while (!st.empty()) st.pop(); for (int i = 0; i < allVertex.size(); i++) { int u = allVertex[i]; while (!st.empty() && en[st.top()] < sta[u]) st.pop(); if (st.empty()) { st.push(u); continue; } if (st.top() == u) continue; b[st.top()].push_back(mp(u, lcadis(st.top(), u))); b[u].push_back(mp(st.top(), lcadis(st.top(), u))); st.push(u); } } bool mark[N]; ll dist[N]; priority_queue<pair<ll, ll> , vector<pair<ll, ll> >, greater<pair<ll, ll> > > pq; ll Query(int S, int X[], int T, int Y[]) { while (!pq.empty()) pq.pop(); allVertex.clear(); for (ll i = 0; i < S; i++) X[i]++, allVertex.push_back(X[i]); for (ll i = 0; i < T; i++) Y[i]++, allVertex.push_back(Y[i]); makeEdge(); for (auto u : allVertex) dist[u] = 1e18; for (ll i = 0; i < S; i++) pq.push(mp(0, X[i])), dist[X[i]] = 0; for (ll i = 0; i < T; i++) mark[Y[i]] = true; ll ret = 1e18; while (!pq.empty()) { ll u = pq.top().se; ll d = pq.top().fi; pq.pop(); if (d != dist[u]) continue; if (mark[u]) { ret = d; break; } for (ll i = 0; i < b[u].size(); i++) { ll v = b[u][i].fi; ll w = b[u][i].se; if (dist[v] > dist[u] + w) { dist[v] = dist[u] + w; pq.push(mp(dist[v], v)); } } } for (ll i = 0; i < T; i++) mark[Y[i]] = false; for (auto u : allVertex) b[u].clear(); return ret; } #ifdef UncleGrandpa #define MAX_N 500000 #define MAX_Q 100000 #define MAX_SUM_ST 1000000 #define MAX_VALUE 1000000000 static int _N, _Q; static int _A[MAX_N], _B[MAX_N], _D[MAX_N]; static int _S[MAX_N]; static int _T[MAX_N]; static int _X[MAX_SUM_ST]; static int _Y[MAX_SUM_ST]; static int _Qx[MAX_N]; static int _Qy[MAX_N]; #endif #ifdef UncleGrandpa int main() { #ifdef in1code freopen("1test.inp", "r", stdin); #endif int i, j, k; int STop, TTop; if (2 != scanf("%d%d", &_N, &_Q)) { fprintf(stderr, "error: cannot read _N and _Q.\n"); exit(1); } if (!(2 <= _N && _N <= MAX_N)) { fprintf(stderr, "error: _N is out of bounds.\n"); exit(1); } if (!(1 <= _Q && _Q <= MAX_Q)) { fprintf(stderr, "error: _Q is out of bounds.\n"); exit(1); } for (i = 0; i < _N - 1; ++i) { if (1 != scanf("%d", &_A[i])) { fprintf(stderr, "error: cannot read _A[%d].\n", i); exit(1); } if (!(0 <= _A[i] && _A[i] <= _N - 1)) { fprintf(stderr, "error: _A[%d] is out of bounds.\n", i); exit(1); } if (1 != scanf("%d", &_B[i])) { fprintf(stderr, "error: cannot read _B[%d].\n", i); exit(1); } if (!(0 <= _B[i] && _B[i] <= _N - 1)) { fprintf(stderr, "error: _B[%d] is out of bounds.\n", i); exit(1); } if (_A[i] == _B[i]) { fprintf(stderr, "error: _B[%d] is equal to _A[%d].\n", i, i); exit(1); } if (1 != scanf("%d", &_D[i])) { fprintf(stderr, "error: cannot read _D[%d].\n", i); exit(1); } if (!(1 <= _D[i] && _D[i] <= MAX_VALUE)) { fprintf(stderr, "error: _D[%d] is out of bounds.\n", i); exit(1); } } STop = 0; TTop = 0; for (j = 0; j < _Q; ++j) { if (2 != scanf("%d%d", &_S[j], &_T[j])) { fprintf(stderr, "error: cannot read L[%d] and R[%d].\n", j, j); exit(1); } if (STop + _S[j] > MAX_SUM_ST) { fprintf(stderr, "error: _S[0] + _S[1] + ... + _S[%d] is out of bounds.\n", j); exit(1); } if (TTop + _T[j] > MAX_SUM_ST) { fprintf(stderr, "error: _T[0] + _T[1] + ... + _T[%d] is out of bounds.\n", j); exit(1); } for (k = 0; k < _S[j]; ++k, ++STop) { if (1 != scanf("%d", &_X[STop])) { fprintf(stderr, "error: cannot read _X[%d][%d].\n", j, k); exit(1); } if (!(0 <= _X[STop] && _X[STop] <= _N - 1)) { fprintf(stderr, "error: cannot read _X[%d][%d].\n", j, k); exit(1); } } for (k = 0; k < _T[j]; ++k, ++TTop) { if (1 != scanf("%d", &_Y[TTop])) { fprintf(stderr, "error: cannot read _Y[%d][%d].\n", j, k); exit(1); } if (!(0 <= _Y[TTop] && _Y[TTop] <= _N - 1)) { fprintf(stderr, "error: cannot read _Y[%d][%d].\n", j, k); exit(1); } } } STop = 0; TTop = 0; Init(_N, _A, _B, _D); for (j = 0; j < _Q; ++j) { for (k = 0; k < _S[j]; k++) { _Qx[k] = _X[STop++]; } for (k = 0; k < _T[j]; k++) { _Qy[k] = _Y[TTop++]; } printf("%lld\n", Query(_S[j], _Qx, _T[j], _Qy)); } return 0; } #endif

Compilation message (stderr)

factories.cpp: In function 'std::ostream& operator<<(std::ostream&, std::vector<int>&)':
factories.cpp:15:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int i = 0; i < x.size(); i++) os << x[i] << sp;
                    ^
factories.cpp: In function 'std::ostream& operator<<(std::ostream&, std::vector<std::pair<int, int> >&)':
factories.cpp:23:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int i = 0; i < x.size(); i++) os << x[i] << endl;
                    ^
factories.cpp: In function 'void dfs(int, int)':
factories.cpp:39:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int i = 0; i < a[u].size(); i++) {
                    ^
factories.cpp: In function 'void makeEdge()':
factories.cpp:114:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int i = 0; i < allVertex.size(); i++) {
                    ^
factories.cpp: In function 'long long int Query(int, int*, int, int*)':
factories.cpp:146:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for (ll i = 0; i < b[u].size(); i++) {
                    ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...