Advertisement
Guest User

Untitled

a guest
Sep 16th, 2019
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.24 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. typedef long long LL;
  6. typedef unsigned long long ULL;
  7. typedef long double LD;
  8.  
  9. #define all(a) a.begin(),a.end()
  10. #define rall(a) a.rbegin(),a.rend()
  11. #define X first
  12. #define Y second
  13. #define pb push_back
  14. #define int long long
  15.  
  16. const LL mod = 1e9 + 7;
  17.  
  18.  
  19. template<class T>
  20. istream& operator >> (istream& in, vector<T>& v){ for (auto &x : v) { in >> x; } return in; }
  21.  
  22. template<class T>
  23. istream& operator >> (istream& in, pair<T, T> & v){ in >> v.X >> v.Y;return in; }
  24.  
  25. template<class T>
  26. ostream& operator << (ostream& out, pair<T, T> & v){ out << v.X << " " << v.Y;return out; }
  27.  
  28. void chkmax(int &a, int b) {
  29. a = max(a, b);
  30. return;
  31. }
  32.  
  33. void chkmin(int &a, int b) {
  34. a = min(a, b);
  35. return;
  36. }
  37.  
  38. LL ppow (LL x, LL s) {
  39. if (!s) return 1;
  40. if (!(s - 1)) return x % mod;
  41. if (s % 2) return (x * ppow (x, s - 1)) % mod;
  42. LL b = ppow (x, s / 2);
  43. return (b * b) % mod;
  44. }
  45.  
  46. main(){
  47. //ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
  48. int n;
  49. cin >> n;
  50. vector<int> a(n);
  51. cin >> a;
  52. vector<int> pos[25];
  53. for (int i = 0;i < n;i++) {
  54. pos[--a[i]].pb(i);
  55. }
  56. int cnt[21][21];
  57. for (int i = 0;i < 20;i++) {
  58. for (int j = 0;j < 20;j++) {
  59. cnt[i][j] = 0;
  60. if (i == j) {
  61. continue;
  62. }
  63. if (pos[i].size() == 0 || pos[j].size() == 0) {
  64. continue;
  65. }
  66. for (auto x : pos[i]) {
  67. int c = int32_t(upper_bound(all(pos[j]), x) - pos[j].begin());
  68. cnt[i][j] += c;
  69. }
  70. }
  71. }
  72. vector<int> dp((1 << 20), 1e18);
  73. dp[0] = 0;
  74. for (int mask = 0;mask < (1 << 20);mask++) {
  75. for (int i = 0;i < 20;i++) {
  76. int cur = 0;
  77. if (mask&(1 << i)) {
  78. continue;
  79. }
  80. for (int j = 0;j < 20;j++) {
  81. if (mask&(1 << j)) {
  82. cur += cnt[j][i];
  83. }
  84. }
  85. chkmin(dp[mask|(1 << i)], dp[mask] + cur);
  86. }
  87. }
  88. /*for (int i = 0;i < (1 << 3);i++) {
  89. cout << dp[i] << '\n';
  90. }*/
  91. cout << dp[(1 << 20) - 1];
  92. return 0;
  93. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement