Dang_Quan_10_Tin

Temp

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