Advertisement
Dang_Quan_10_Tin

HCODE

Feb 14th, 2022
645
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.68 KB | None | 0 0
  1. // I hate Bitset, I hate my Brain, I hate my Life :(
  2.  
  3. #define task ""
  4. #include <iostream>
  5. #include <cstdio>
  6. #include <cstring>
  7. #include <bitset>
  8. #include <vector>
  9. #include <algorithm>
  10.  
  11. using namespace std;
  12.  
  13. using ll = long long;
  14. using ld = long double;
  15.  
  16. constexpr int N = 4e5 + 5;
  17. struct dsu
  18. {
  19.     int par[N];
  20.     dsu()
  21.     {
  22.         memset(par, -1, sizeof par);
  23.     }
  24.  
  25.     int findpar(int v)
  26.     {
  27.         return par[v] < 0 ? v : par[v] = findpar(par[v]);
  28.     }
  29.  
  30.     void Merge(int u, int v)
  31.     {
  32.         u = findpar(u);
  33.         v = findpar(v);
  34.  
  35.         if (u == v)
  36.             return;
  37.  
  38.         if (par[u] < par[v])
  39.             swap(u, v);
  40.         par[v] += par[u];
  41.         par[u] = v;
  42.     }
  43. } f;
  44.  
  45. int n, m, k, val[2];
  46. int u[N], v[N];
  47. char c[N];
  48.  
  49. void Read()
  50. {
  51.     cin >> n >> m >> k;
  52.  
  53.     for (int i = 1; i <= m; ++i)
  54.         cin >> u[i] >> c[i] >> v[i];
  55. }
  56.  
  57. bool Check(int m)
  58. {
  59.     for (int i = 1; i <= n + 2; ++i)
  60.         f.par[i] = -1;
  61.  
  62.     for (int i = 1; i <= m; ++i)
  63.     {
  64.         if (c[i] == '<' || c[i] == '>')
  65.         {
  66.             if (c[i] == '>')
  67.                 swap(u[i], v[i]);
  68.  
  69.             f.Merge(u[i], val[0]);
  70.             f.Merge(v[i], val[1]);
  71.  
  72.             if (c[i] == '>')
  73.                 swap(u[i], v[i]);
  74.         }
  75.         else
  76.             f.Merge(u[i], v[i]);
  77.     }
  78.  
  79.     vector<pair<int, int>> s;
  80.  
  81.     for (int i = 1; i <= n; ++i)
  82.         if (f.findpar(i) != f.findpar(val[0]) && f.findpar(i) != f.findpar(val[1]))
  83.             s.emplace_back(f.findpar(i), -f.par[f.findpar(i)]);
  84.  
  85.     sort(s.begin(), s.end());
  86.     s.resize(unique(s.begin(), s.end()) - s.begin());
  87.  
  88.     bitset<20005> dp1, dp2;
  89.     int tmp = k - (-f.par[f.findpar(val[0])]) + 1;
  90.  
  91.     dp1[0] = 1;
  92.  
  93.     for (auto i : s)
  94.     {
  95.         dp2 |= dp2 << i.second;
  96.         dp2 |= dp1 & (dp1 << i.second);
  97.         dp1 |= dp1 << i.second;
  98.     }
  99.  
  100.     return dp1[tmp] && !(dp2[tmp]);
  101. }
  102.  
  103. void Solve()
  104. {
  105.     if (k == 0 || k == n)
  106.     {
  107.         cout << "0\n";
  108.         return;
  109.     }
  110.  
  111.     val[0] = n + 1;
  112.     val[1] = n + 2;
  113.  
  114.     int l = 1, mid, h = m;
  115.  
  116.     while (l <= h)
  117.     {
  118.         mid = (l + h) / 2;
  119.  
  120.         if (Check(mid))
  121.             h = mid - 1;
  122.         else
  123.             l = mid + 1;
  124.     }
  125.  
  126.     if (l > m)
  127.         cout << "-1\n";
  128.     else
  129.         cout << l << "\n";
  130. }
  131.  
  132. void Destroy()
  133. {
  134. }
  135.  
  136. int32_t main()
  137. {
  138.     ios_base::sync_with_stdio(0);
  139.     cin.tie(0);
  140.     cout.tie(0);
  141.  
  142.     if (fopen(task ".INP", "r"))
  143.     {
  144.         freopen(task ".INP", "r", stdin);
  145.         freopen(task ".OUT", "w", stdout);
  146.     }
  147.  
  148.     int t;
  149.     for (cin >> t; t--;)
  150.     {
  151.         Read();
  152.         Solve();
  153.         Destroy();
  154.     }
  155. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement