Submission #898030

#TimeUsernameProblemLanguageResultExecution timeMemory
898030vjudge1Tourism (JOI23_tourism)C++17
35 / 100
5076 ms67496 KiB
// MDSPro // #pragma GCC optimize("Ofast") // #pragma GCC optimize ("unroll-loops") // #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx") #include "bits/stdc++.h" using namespace std; using ll = long long; using ld = long double; const ld PI = 3.141592653589793; const int MOD = 1e9+7; const int INF = 1e9; const ll INFLL = 4e18; const double EPS = 1e-9; const int MAXN = 1000*1007; template<typename T> struct SparseTable { vector<vector<T>> sparse; function<T(const T&, const T&)> merge; SparseTable(const vector<T>& arr, const function<T(const T&, const T&)>& func) : merge(func) { int n = arr.size(); int logn = 32 - __builtin_clz(n); sparse.resize(logn, vector<T>(n)); sparse[0] = arr; for (int lg = 1; lg < logn; lg++) { for (int i = 0; i + (1 << lg) <= n; i++) { sparse[lg][i] = merge(sparse[lg - 1][i], sparse[lg - 1][i + (1 << (lg - 1))]); } } } T get(int l, int r) { // [l, r) int cur_log = 31 - __builtin_clz(r - l); return merge(sparse[cur_log][l], sparse[cur_log][r - (1 << cur_log)]); } }; void solve(int NT){ int n, m, q; cin >> n >> m >> q; vector<vector<int>> g(n + 1); int ok = 1; for(int i = 1; i < n; ++i) { int x, y; cin >> x >> y; g[x].emplace_back(y); g[y].emplace_back(x); ok &= (x == i) & (y == i + 1); } int timer = 1; vector<pair<int, int>> euler_tour; vector<int> t_in(n + 1), dep(n + 1), t_out(n + 1), occ(n + 1); auto dfs = [&](auto dfs, int x, int d = 1) -> void { t_in[x] = ++timer; dep[x] = d; occ[x] = euler_tour.size(); euler_tour.emplace_back(x, dep[x]); for(int z: g[x]) { if(dep[z] == 0) { dfs(dfs, z, d + 1); euler_tour.emplace_back(x, dep[x]); } } t_out[x] = timer; }; auto upper = [&](int x, int y) -> bool { return t_in[x] <= t_in[y] && t_out[y] <= t_out[x]; }; dfs(dfs, 1); SparseTable<pair<int, int>> sp(euler_tour, [&](auto x, auto y) { if(x.second < y.second) return x; return y; }); auto lca = [&](int x, int y) -> int { return sp.get(min(occ[x], occ[y]), max(occ[x], occ[y]) + 1).first; }; vector<int> c(m); for(int i = 0; i < m; ++i) cin >> c[i]; auto virt_tree = [&](int l, int r) -> int { vector<int> v; for(int i = l; i < r; ++i) v.emplace_back(c[i]); sort(v.begin(), v.end(), [&](int x, int y){return t_in[x] < t_in[y];}); for(int i = 1; i < r - l; ++i) { int nvert = lca(v[i - 1], v[i]); v.emplace_back(nvert); } sort(v.begin(), v.end(), [&](int x, int y){return t_in[x] < t_in[y];}); v.erase(unique(v.begin(), v.end()), v.end()); int sz = v.size(), ans = 0; vector<int> st; st.emplace_back(v[0]); for(int i = 1; i < sz; ++i) { int x = v[i]; while(st.size() >= 2 && !upper(st.back(), x)) { ans += dep[st.back()] - dep[st[st.size() - 2]]; st.pop_back(); } st.emplace_back(x); } while (st.size() >= 2) { ans += dep[st.back()] - dep[st[st.size() - 2]]; st.pop_back(); } return ans + 1; }; if(ok == 1) { SparseTable<int> sp_mn(c, [&](int x, int y){return min(x, y);}); SparseTable<int> sp_mx(c, [&](int x, int y){return max(x, y);}); while(q--) { int l, r; cin >> l >> r; l--; int dis = sp_mx.get(l, r) - sp_mn.get(l, r) + 1; cout << dis << '\n'; } } else { while(q--) { int l, r; cin >> l >> r; l--; cout << virt_tree(l, r) << '\n'; } } } // #define TESTCASES int main() { cin.tie(0)->sync_with_stdio(0); int t = 1; #ifdef TESTCASES cin >> t; #endif for(int i = 1; i <= t; ++i){ solve(i); cout << "\n"; } }
#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...