Advertisement
SAURAVKR

subtree queries

Jan 25th, 2025
14
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.84 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. class Solution {
  5. public:
  6.     vector<int> solve(int n, vector<vector<int>>& g, int q, vector<vector<int>>& queries) {
  7.         vector<vector<int>> adj(n + 1);
  8.         for (int i = 0; i < g.size(); ++i) {
  9.             int u = g[i][0], v = g[i][1];
  10.             adj[u].push_back(v);
  11.             adj[v].push_back(u);
  12.         }
  13.        
  14.         vector<int> ans;
  15.         for (int i = 0; i < queries.size(); ++i) {
  16.             int x = queries[i][0];
  17.             int k = queries[i][1];
  18.            
  19.             vector<int> parent(n + 1, -1);
  20.             vector<int> size_vec(n + 1, 1);
  21.            
  22.             stack<pair<int, bool>> postack;
  23.             postack.push(make_pair(x, false));
  24.            
  25.             while (!postack.empty()) {
  26.                 pair<int, bool> top = postack.top();
  27.                 int u = top.first;
  28.                 bool processed = top.second;
  29.                 postack.pop();
  30.                
  31.                 if (!processed) {
  32.                     postack.push(make_pair(u, true));
  33.                     vector<int> children;
  34.                     for (int j = 0; j < adj[u].size(); ++j) {
  35.                         int v = adj[u][j];
  36.                         if (v != parent[u]) {
  37.                             children.push_back(v);
  38.                         }
  39.                     }
  40.                     reverse(children.begin(), children.end());
  41.                     for (int j = 0; j < children.size(); ++j) {
  42.                         int v = children[j];
  43.                         parent[v] = u;
  44.                         postack.push(make_pair(v, false));
  45.                     }
  46.                 } else {
  47.                     for (int j = 0; j < adj[u].size(); ++j) {
  48.                         int v = adj[u][j];
  49.                         if (v != parent[u]) {
  50.                             size_vec[u] += size_vec[v];
  51.                         }
  52.                     }
  53.                 }
  54.             }
  55.            
  56.             vector<int> all_sizes;
  57.             for (int j = 1; j <= n; ++j) {
  58.                 all_sizes.push_back(size_vec[j]);
  59.             }
  60.             sort(all_sizes.begin(), all_sizes.end());
  61.            
  62.             if (k - 1 < all_sizes.size()) {
  63.                 ans.push_back(all_sizes[k - 1]);
  64.             } else {
  65.                 ans.push_back(-1);
  66.             }
  67.         }
  68.         return ans;
  69.     }
  70. };
  71.  
  72. int main()
  73. {
  74.     int n;cin >> n;
  75.     vector<vector<int>>adj(n-1,vector<int>(2,0));
  76.     for(int i = 0; i < n - 1; i++)
  77.     {
  78.         cin >> adj[i][0] >> adj[i][1];
  79.     }
  80.     int q;cin >> q;
  81.     vector<vector<int>>queries(q,vector<int>(2,0));
  82.     for(int i = 0; i < q; i++)
  83.     cin>>queries[i][0]>>queries[i][1];
  84.     Solution sol;
  85.     vector<int>ans = sol.solve(n,adj,q,queries);
  86.     for(int i = 0; i < ans.size();i++)
  87.     cout << ans[i] << " ";
  88.    
  89. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement