Advertisement
skimono

300 IQ abuse bitset

Dec 13th, 2022
727
1
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.04 KB | None | 1 0
  1. // clang-format off
  2. #define _CRT_SECURE_NO_WARNINGS
  3.  
  4. #include <iostream>
  5. #include <vector>
  6. #include <string>
  7. #include <algorithm>
  8. #include <cmath>
  9. #include <stack>
  10. #include <iomanip>
  11. #include <fstream>
  12. #include <string>
  13. #include <set>
  14. #include <deque>
  15. #include <queue>
  16. #include <map>
  17. #include <bitset>
  18. #include <random>
  19. #include <list>
  20. #include <unordered_map>
  21. #include <unordered_set>
  22. #include <cassert>
  23.  
  24. using namespace std;
  25.  
  26. typedef long long ll;
  27. typedef unsigned long long ull;
  28. typedef long double ld;
  29. typedef string str;
  30. //typedef __int128 ultraint;
  31. #define sqrt sqrtl
  32. #define F first
  33. #define S second
  34. #define endl '\n'
  35. #define all(vc666) vc666.begin(), vc666.end()
  36. #define allr(vc666) vc666.rbegin(), vc666.rend()
  37. //#define int long long
  38. #define degug(x) cerr (#x) << " " << (x) << endl;
  39.  
  40. const ll INF = (ll)2e18 + 7;
  41. const ll inf = 1e9 + 7;
  42. const ll ONE = 1;
  43. const ll MOD = 1e8;
  44. ld EPS = 1e-12;
  45. ld PI = 3.1415926535897932384;
  46. mt19937_64 gen(3);
  47. const ll max_sz = 405;
  48.  
  49. int dp[max_sz][max_sz];
  50. bitset <max_sz> zxc[max_sz][max_sz];
  51.  
  52. void solve() {
  53.     int n, M, i, j, l, r, m, sup, len;
  54.     cin >> n >> M;
  55.     for (i = 0; i < max_sz; i++) {
  56.         for (j = 0; j < max_sz; j++) {
  57.             dp[i][j] = inf;
  58.         }
  59.     }
  60.     vector <int> a(n), cnt(M + 1);
  61.     for (i = 0; i < n; i++) {
  62.         cin >> a[i];
  63.     }
  64.     for (i = 0; i < n; i++) {
  65.         dp[i][i] = 0;
  66.         zxc[i][i][a[i]] = true;
  67.     }
  68.     for (len = 2; len <= n; len++) {
  69.         for (l = 0; l <= n - len; l++) {
  70.             r = l + len - 1;
  71.             cnt.assign(M + 1, 0);
  72.             for (i = l; i <= r; i++) {
  73.                 cnt[a[i]]++;
  74.             }
  75.             for (m = l; m < r; m++) {
  76.                 if (cnt[a[m]] > 1 && zxc[l][m][a[m]] && zxc[m + 1][r][a[m]]) {
  77.                     if (dp[l][r] > dp[l][m] + dp[m + 1][r]) {
  78.                         dp[l][r] = dp[l][m] + dp[m + 1][r];
  79.                         zxc[l][r] = (zxc[l][m] & zxc[m + 1][r]);
  80.                     }
  81.                     else if (dp[l][r] == dp[l][m] + dp[m + 1][r]) {
  82.                         zxc[l][r] |= (zxc[l][m] & zxc[m + 1][r]);
  83.                     }
  84.                 }
  85.                 else {
  86.                     if (dp[l][r] > dp[l][m] + dp[m + 1][r] + 1) {
  87.                         dp[l][r] = dp[l][m] + dp[m + 1][r] + 1;
  88.                         zxc[l][r] = (zxc[l][m] | zxc[m + 1][r]);
  89.                     }
  90.                     else if (dp[l][r] == dp[l][m] + dp[m + 1][r] + 1) {
  91.                         zxc[l][r] |= (zxc[l][m] | zxc[m + 1][r]);
  92.                     }
  93.                 }
  94.                 cnt[a[m]]--;
  95.             }
  96.         }
  97.     }
  98.     cout << dp[0][n - 1] << endl;
  99. }
  100.  
  101. signed main() {
  102. #ifdef _DEBUG
  103.     freopen("input.txt", "r", stdin);
  104.     freopen("output.txt", "w", stdout);
  105. #endif
  106.     //freopen("ladder.in", "r", stdin);
  107.     //freopen("ladder.out", "w", stdout);
  108.     ios_base::sync_with_stdio(0);
  109.     cin.tie(NULL);
  110.     cout.tie(NULL);
  111.     int t = 1;
  112.     //cin >> t;
  113.     while (t--) solve();
  114. }
  115. //Deisgned by skimono
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement