Advertisement
Dang_Quan_10_Tin

DUONG DI NGAN NHAT (Du Tuyen 2 2021)

Dec 27th, 2021
1,120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.33 KB | None | 0 0
  1. #define task ""
  2.  
  3. #include <iostream>
  4. #include <cstdio>
  5. #include <vector>
  6. #include <set>
  7. #include <queue>
  8. #include <deque>
  9. #include <algorithm>
  10. #include <cstring>
  11. #include <unordered_map>
  12.  
  13. using namespace std;
  14.  
  15. using ll = long long;
  16. using ld = long double;
  17.  
  18. constexpr int N = 5e5 + 5;
  19. constexpr int M = 6e5 + 5;
  20. constexpr int Inf = 1e9 + 7;
  21.  
  22. struct SegmentTree
  23. {
  24.     int st[M * 4], n;
  25.     SegmentTree()
  26.     {
  27.         fill_n(st, M * 4, Inf);
  28.     }
  29.  
  30.     void Update(int id, int l, int r, const int &a, const int &b, const int &v)
  31.     {
  32.         if (l > b || r < a)
  33.             return;
  34.         if (l >= a && r <= b)
  35.         {
  36.             st[id] = min(st[id], v);
  37.             return;
  38.         }
  39.         Update(id << 1, l, (l + r) / 2, a, b, v);
  40.         Update(id << 1 | 1, (l + r) / 2 + 1, r, a, b, v);
  41.     }
  42.  
  43.     void Update(int l, int r, int v)
  44.     {
  45.         Update(1, 1, n, l, r, v);
  46.     }
  47.  
  48.     int Get(int x)
  49.     {
  50.         int id = 1, l = 1, r = n, ans(Inf);
  51.         while (1)
  52.         {
  53.             ans = min(ans, st[id]);
  54.             if (l == r)
  55.                 break;
  56.             if ((l + r) / 2 >= x)
  57.             {
  58.                 id = id << 1;
  59.                 r = (l + r) / 2;
  60.             }
  61.             else
  62.             {
  63.                 id = id << 1 | 1;
  64.                 l = (l + r) / 2 + 1;
  65.             }
  66.         }
  67.  
  68.         return ans;
  69.     }
  70. } f;
  71.  
  72. vector<int> adj[M], nadj[M];
  73. int n, m, s, t, q, u[N], v[N], a[M];
  74. int d[2][M], in[M], l;
  75. bool vis[M];
  76.  
  77. void Read()
  78. {
  79.     cin >> n >> m >> s >> t;
  80.     f.n = n + m;
  81.  
  82.     for (int i = 1; i <= m; ++i)
  83.     {
  84.         cin >> u[i] >> v[i];
  85.         adj[u[i]].emplace_back(n + i);
  86.         adj[n + i].emplace_back(v[i]);
  87.         nadj[v[i]].emplace_back(n + i);
  88.         nadj[n + i].emplace_back(u[i]);
  89.     }
  90.  
  91.     cin >> q;
  92. }
  93.  
  94. void BFS(int x, int d[M], vector<int> adj[M])
  95. {
  96.     fill_n(d, M, Inf);
  97.     queue<int> q;
  98.     q.emplace(x);
  99.     d[x] = 0;
  100.  
  101.     while (!q.empty())
  102.     {
  103.         int c = q.front();
  104.         q.pop();
  105.  
  106.         for (auto i : adj[c])
  107.             if (d[i] == Inf)
  108.             {
  109.                 q.emplace(i);
  110.                 d[i] = d[c] + 1;
  111.             }
  112.     }
  113. }
  114.  
  115. void dfs(int v)
  116. {
  117.     vis[v] = 1;
  118.     for (auto i : adj[v])
  119.         if (!vis[i])
  120.             dfs(i);
  121.  
  122.     a[++l] = v;
  123. }
  124.  
  125. void Solve()
  126. {
  127.     BFS(s, d[0], adj);
  128.     BFS(t, d[1], nadj);
  129.  
  130.     for (int i = 1; i <= n + m; ++i)
  131.         if (!vis[i])
  132.             dfs(i);
  133.  
  134.     reverse(a + 1, a + n + m + 1);
  135.  
  136.     for (int i = 1; i <= n + m; ++i)
  137.         in[a[i]] = i;
  138.  
  139.     for (int i = 1; i <= m; ++i)
  140.         if (d[0][u[i]] < Inf && d[1][v[i]] < Inf)
  141.         {
  142.             int val = d[0][u[i]] + d[1][v[i]] + 2;
  143.             f.Update(in[u[i]] + 1, in[n + i] - 1, val);
  144.             f.Update(in[n + i] + 1, in[v[i]] - 1, val);
  145.         }
  146.  
  147.     while (q--)
  148.     {
  149.         char t;
  150.         int x;
  151.         cin >> t >> x;
  152.         int v;
  153.  
  154.         if (t == 'V')
  155.             v = f.Get(in[x]);
  156.         else
  157.             v = f.Get(in[x + n]);
  158.  
  159.         cout << (v == Inf ? -1 : v / 2) << "\n";
  160.     }
  161. }
  162.  
  163. int32_t main()
  164. {
  165.     ios::sync_with_stdio(0);
  166.     cin.tie(0);
  167.     cout.tie(0);
  168.     if (fopen(task ".INP", "r"))
  169.     {
  170.         freopen(task ".INP", "r", stdin);
  171.         freopen(task ".OUT", "w", stdout);
  172.     }
  173.     Read();
  174.     Solve();
  175. }
  176.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement