Advertisement
pb_jiang

CF587C AC

Sep 2nd, 2023
1,161
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.17 KB | None | 0 0
  1. #include <assert.h>
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4. #ifndef __DEBUG__
  5. #define dbg(...) 42
  6. #endif
  7. template <class T> using mpq = priority_queue<T, vector<T>, greater<T>>;
  8.  
  9. using ll = long long;
  10. using pii = pair<int, int>;
  11. using pll = pair<ll, ll>;
  12. using vl = vector<ll>;
  13. using vi = vector<int>;
  14.  
  15. class LPQ
  16. {
  17.   public:
  18.     LPQ(int n) : n_(n) { data = vi(12, INT_MAX); }
  19.     // LPQ(int n) : n_(n) {}
  20.     void insert(int x)
  21.     {
  22.         /*
  23.         data.insert(x);
  24.         while (data.size() > 11) {
  25.             data.erase(data.begin());
  26.         }
  27.         */
  28.         for (int i = 0; i < 11; ++i)
  29.             if (data[i] == x)
  30.                 return;
  31.         data[11] = x;
  32.         sort(data.begin(), data.end());
  33.     }
  34.     int n_;
  35.     // priority_queue<int> data;
  36.     // set<int, greater<int>> data;
  37.     vi data;
  38. };
  39.  
  40. int main(int argc, char **argv)
  41. {
  42.     // cin.tie(nullptr)->sync_with_stdio(false);
  43.     // cout.tie(nullptr)->sync_with_stdio(false);
  44.     // ios::sync_with_stdio(false);
  45.     // cin.tie(0);
  46.     // cout.tie(0);
  47.     ios::sync_with_stdio(false);
  48.     cin.tie(0);
  49.  
  50.     int n, m, q, u, v, a;
  51.     cin >> n >> m >> q;
  52.     vector<vi> g(n + 1);
  53.     for (int i = 1; i < n; ++i)
  54.         cin >> u >> v, g[u].push_back(v), g[v].push_back(u);
  55.  
  56.     map<int, vector<int>> cs;
  57.     for (int i = 0; i < m; ++i) {
  58.         cin >> a;
  59.         cs[a].push_back(i + 1);
  60.     }
  61.     for (auto &[k, v] : cs) {
  62.         sort(v.begin(), v.end());
  63.         if (v.size() > 10)
  64.             v.erase(v.begin() + 10, v.end());
  65.     }
  66.  
  67.     using a10i = array<int, 10>;
  68.     constexpr int log = 18;
  69.     vector<vi> pa(n + 1, vi(log));
  70.     vector<vector<a10i>> ppl(n + 1, vector<a10i>(log));
  71.     vi dep(n + 1);
  72.     function<void(int, int, int)> dfs = [&](int u, int fa, int depth) {
  73.         dep[u] = depth;
  74.         if (fa != -1)
  75.             pa[u][0] = fa;
  76.         size_t pcnt = min(size_t(10), cs[u].size());
  77.         for (int i = 0; i < pcnt; ++i)
  78.             ppl[u][0][i] = cs[u][i];
  79.         for (int i = 1; i < log; ++i) {
  80.             pa[u][i] = pa[pa[u][i - 1]][i - 1];
  81.             /*
  82.             vi ss(ppl[u][i - 1].begin(), ppl[u][i - 1].end());
  83.             ss.reserve(32);
  84.             for (auto x : ppl[pa[u][i - 1]][i - 1])
  85.                 ss.push_back(x);
  86.             set<int> ps(ss.begin(), ss.end());
  87.             ps.insert(0);
  88.             auto it = next(ps.begin());
  89.             for (int j = 0; j < 10 && it != ps.end(); ++j, ++it) {
  90.                 ppl[u][i][j] = *it;
  91.             }
  92.             */
  93.             const auto &pu = ppl[u][i - 1], &pv = ppl[pa[u][i - 1]][i - 1];
  94.             int m = 0, n = 0, k = 0;
  95.             while (k < 10 && m < 10 && n < 10 && pu[m] && pv[n]) {
  96.                 if (pu[m] < pv[n]) {
  97.                     ppl[u][i][k] = pu[m];
  98.                     ++k, ++m;
  99.                 } else {
  100.                     ppl[u][i][k] = pv[n];
  101.                     ++k, ++n;
  102.                 }
  103.             }
  104.             while (k < 10 && m < 10 && pu[m]) {
  105.                 ppl[u][i][k] = pu[m];
  106.                 ++m, ++k;
  107.             }
  108.             while (k < 10 && n < 10 && pv[n]) {
  109.                 ppl[u][i][k] = pv[n];
  110.                 ++n, ++k;
  111.             }
  112.         }
  113.         for (auto v : g[u]) {
  114.             if (v == fa)
  115.                 continue;
  116.             dfs(v, u, depth + 1);
  117.         }
  118.     };
  119.     dfs(1, -1, 0);
  120.  
  121.     function<vector<int>(int, int, int)> lca = [&](int u, int v, int a) {
  122.         ll cnt = 0;
  123.         set<int> ans{0};
  124.         // priority_queue<int> pq;
  125.         LPQ pq(10);
  126.         // dbg(u, v);
  127.         if (dep[u] < dep[v])
  128.             swap(u, v);
  129.         for (int step = log - 1; step >= 0; --step) {
  130.             if (dep[pa[u][step]] >= dep[v]) {
  131.                 for (auto x : ppl[u][step])
  132.                     pq.insert(x);
  133.                 u = pa[u][step];
  134.             }
  135.             ++cnt;
  136.         }
  137.         if (u != v) {
  138.             for (int step = log - 1; step >= 0; --step) {
  139.                 if (pa[u][step] != pa[v][step]) {
  140.                     for (auto x : ppl[u][step])
  141.                         pq.insert(x);
  142.                     for (auto x : ppl[v][step])
  143.                         pq.insert(x);
  144.                     u = pa[u][step], v = pa[v][step];
  145.                 }
  146.                 ++cnt;
  147.             }
  148.             for (auto x : ppl[u][0])
  149.                 pq.insert(x);
  150.             for (auto x : ppl[v][0])
  151.                 pq.insert(x);
  152.             u = pa[u][0];
  153.         }
  154.  
  155.         for (auto x : cs[u])
  156.             pq.insert(x);
  157.         /*
  158.         while (pq.data.size())
  159.             ans.insert(pq.data.top()), pq.data.pop();
  160.         */
  161.         assert(cnt < 20 * 2);
  162.         for (auto x : pq.data)
  163.             if (x != INT_MAX)
  164.                 ans.insert(x);
  165.         vector<int> ret;
  166.         auto it = next(ans.begin());
  167.         for (int i = 0; i < a && it != ans.end(); ++it, ++i)
  168.             ret.push_back(*it);
  169.         // dbg(ans, u);
  170.         return ret;
  171.     };
  172.     for (int i = 0; i < q; ++i) {
  173.         cin >> u >> v >> a;
  174.         auto ans = lca(u, v, a);
  175.         cout << ans.size();
  176.         for (auto x : ans)
  177.             cout << ' ' << x;
  178.         cout << '\n';
  179.     }
  180.     return 0;
  181. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement