Advertisement
Dang_Quan_10_Tin

CNET

Sep 10th, 2020
219
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.78 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. #include <cstdio>
  5. #include <cmath>
  6. #define task "CNET"
  7. using namespace std;
  8. using ll = long long;
  9. using ld = long double;
  10.  
  11. const int N = 1e5 + 2;
  12. int n, m, ranks[N], par[N][18], Blue[N], Gay[N];
  13. vector<pair<int, int>> adj[N];
  14. bool blue[N * 2], gay[N * 2], multi[N * 2];
  15. pair<int, int> s[N * 2];
  16. int num[N], low[N], cnt(0);
  17.  
  18. void Read()
  19. {
  20.     cin >> n >> m;
  21.     for (int i = 1; i <= m; ++i)
  22.     {
  23.         cin >> s[i].first >> s[i].second;
  24.         if (s[i].first > s[i].second)
  25.             swap(s[i].first, s[i].second);
  26.     }
  27.     sort(s + 1, s + m + 1);
  28.     for (int i = 1; i <= m; ++i)
  29.     {
  30.         int j = i;
  31.         while (j <= m && s[i] == s[j])
  32.             ++j;
  33.         adj[s[i].first].emplace_back(s[i].second, i);
  34.         adj[s[i].second].emplace_back(s[i].first, i);
  35.         multi[i] = j - i > 1;
  36.         i = j - 1;
  37.     }
  38. }
  39.  
  40. void dfs(int v, int p = 1)
  41. {
  42.     int child(0);
  43.     num[v] = low[v] = ++cnt;
  44.     for (auto t : adj[v])
  45.         if (t.first != p)
  46.         {
  47.             int &i = t.first;
  48.             if (num[i])
  49.                 low[v] = min(low[v], num[i]);
  50.             else
  51.             {
  52.                 par[i][0] = v;
  53.                 ++child;
  54.                 dfs(i, v);
  55.                 /// CriticalEdge
  56.                 if (low[i] > num[v] && !multi[t.second])
  57.                     blue[t.second] = 1;
  58.                 /// CriticalNode
  59.                 if (v != p && low[i] >= num[v])
  60.                     gay[t.second] = 1;
  61.                 low[v] = min(low[v], low[i]);
  62.             }
  63.         }
  64.     if (v == p)
  65.         if (child > 1)
  66.             for (auto t : adj[v])
  67.                 if (par[t.first][0] == v)
  68.                     if (low[t.first] >= num[v])
  69.                         gay[t.second] = 1;
  70. }
  71.  
  72. void GetAns(int v)
  73. {
  74.     for (int i = 1; i <= 17; ++i)
  75.         par[v][i] = par[par[v][i - 1]][i - 1];
  76.     for (auto t : adj[v])
  77.         if (par[t.first][0] == v)
  78.         {
  79.             int &i = t.first;
  80.             ranks[i] = ranks[v] + 1;
  81.             Blue[i] = Blue[v] + blue[t.second];
  82.             Gay[i] = Gay[v] + gay[t.second];
  83.             GetAns(t.first);
  84.         }
  85. }
  86.  
  87. int lca(int u, int v)
  88. {
  89.     if (ranks[u] < ranks[v])
  90.         swap(u, v);
  91.     for (int i = log2(ranks[u]); ~i; --i)
  92.         if (ranks[par[u][i]] >= ranks[v])
  93.             u = par[u][i];
  94.     for (int i = log2(ranks[u]); ~i; --i)
  95.         if (par[u][i] != par[v][i])
  96.         {
  97.             u = par[u][i];
  98.             v = par[v][i];
  99.         }
  100.     while (u != v)
  101.     {
  102.         u = par[u][0];
  103.         v = par[v][0];
  104.     }
  105.     return v;
  106. }
  107.  
  108. int Check(int u, int v, int t)
  109. {
  110.     if (u == t || v == t)
  111.     {
  112.         if (u == t)
  113.             swap(u, v);
  114.         for (int i = log2(ranks[u]); ~i; --i)
  115.             if (ranks[par[u][i]] > ranks[t])
  116.                 u = par[u][i];
  117.         return Gay[u] - Gay[t];
  118.     }
  119.     else
  120.     {
  121.         for (int i = log2(ranks[u]); ~i; --i)
  122.             if (ranks[par[u][i]] > ranks[t])
  123.                 u = par[u][i];
  124.         for (int i = log2(ranks[v]); ~i; --i)
  125.             if (ranks[par[v][i]] > ranks[t])
  126.                 v = par[v][i];
  127.         return (Gay[u] - Gay[t]) && (Gay[v] - Gay[t]);
  128.     }
  129. }
  130.  
  131. void Solve()
  132. {
  133.     int q;
  134.     cin >> q;
  135.     while (q--)
  136.     {
  137.         int a, b;
  138.         cin >> a >> b;
  139.         int v = lca(a, b);
  140.         cout << Gay[a] + Gay[b] - 2 * Gay[v] + 2 - Check(a, b, v) << " ";
  141.         cout << Blue[a] + Blue[b] - 2 * Blue[v] << "\n";
  142.     }
  143. }
  144.  
  145. int32_t main()
  146. {
  147.     ios::sync_with_stdio(0);
  148.     cin.tie(0);
  149.     cout.tie(0);
  150.     if (fopen(task ".INP", "r"))
  151.         freopen(task ".INP", "r", stdin),
  152.             freopen(task ".OUT", "w", stdout);
  153.     Read();
  154.     dfs(1);
  155.     ranks[1] = 1;
  156.     GetAns(1);
  157.     Solve();
  158. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement