#include <bits/stdc++.h> using namespace std; #define For(i, n) for (int i = 0; i < int(n); i++) #define ForD(i, n) for (int i = int(n) - 1; i >= 0; i--) #define SORT(x) sort(begin(x), end(x)) #define REP(i, begin, end) for (__typeof(end) i = (begin) - ((begin) > (end)); i != (end) - ((begin) > (end)); i += 1 - 2 * ((begin) > (end))) template<typename T, typename U> pair<T, U>& operator+=(pair<T, U> &lhs, const pair<T, U> &rhs){ lhs.first += rhs.first; lhs.second += rhs.second; return lhs; } template<typename T, typename U> pair<T, U>& operator-=(pair<T, U> &lhs, const pair<T, U> &rhs){ lhs.first -= rhs.first; lhs.second -= rhs.second; return lhs; } template <class T> ostream &operator<<(ostream &os, const vector<T> &container) { for (auto &u : container) os << u << " "; return os; } template <class T, class U> ostream &operator<<(ostream &os, const pair<T, U> &p) { os << p.first << " " << p.second; return os; } #include <ext/pb_ds/assoc_container.hpp> // Common file #include <ext/pb_ds/tree_policy.hpp> // Including tree_order_statistics_node_update // #include <ext/pb_ds/detail/standard_policies.hpp> using namespace __gnu_pbds; using namespace std; template<typename T> using pb_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>; #if DEBUG #define error(args...) { string _s = #args; replace(_s.begin(), _s.end(), ',', ' '); stringstream _ss(_s); istream_iterator<string> _it(_ss); err(_it, args); } void err(istream_iterator<string>) {} template<typename T, typename... Args> void err(istream_iterator<string> it, T a, Args... args) { cerr << *it << " = " << a << endl; err(++it, args...); } #else #define error(...) do {} while (0) #endif template<typename T, typename U> pair<T, U> operator-(const pair<T, U> &l, const pair<T, U> &r) { return {l.first - r.first, l.second - r.second}; } template<typename T, typename U> pair<T, U> operator+(const pair<T, U> &l, const pair<T, U> &r) { return {l.first + r.first, l.second + r.second}; } #define _upgrade do { ios::sync_with_stdio(0); cin.tie(0); } while (0) typedef long long ll; typedef long double ld; typedef pair<int, int> pii; typedef pair<ll, ll> pll; const int N = 45; const int inf = 1<<30; int A[N]; int best[N]; ll best_cnt[N]; inline void count_inver(ll mask, int n) { int k = __builtin_popcountll(mask); int cnt = 0; int curr = best[k]; bitset<35> vis; For (i, n) { if (mask & (1LL << i)) { for (int j = A[i] + 1; j <= n; j++) { if (vis[j]) cnt++; if (cnt > curr) return; } vis[A[i]] = 1; } } if (cnt < curr) { best[k] = cnt; best_cnt[k] = 1; } else if (cnt == curr) { best_cnt[k]++; } } int main() { _upgrade; int n; cin >> n; For (i, n) cin >> A[i]; For (i, n + 1) best[i] = inf; for (ll i = 1; i < (1 << n); i++) count_inver(i, n); For (i, n) cout << best[i + 1] << " " << best_cnt[i + 1] << "\n"; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 | #include <bits/stdc++.h> using namespace std; #define For(i, n) for (int i = 0; i < int(n); i++) #define ForD(i, n) for (int i = int(n) - 1; i >= 0; i--) #define SORT(x) sort(begin(x), end(x)) #define REP(i, begin, end) for (__typeof(end) i = (begin) - ((begin) > (end)); i != (end) - ((begin) > (end)); i += 1 - 2 * ((begin) > (end))) template<typename T, typename U> pair<T, U>& operator+=(pair<T, U> &lhs, const pair<T, U> &rhs){ lhs.first += rhs.first; lhs.second += rhs.second; return lhs; } template<typename T, typename U> pair<T, U>& operator-=(pair<T, U> &lhs, const pair<T, U> &rhs){ lhs.first -= rhs.first; lhs.second -= rhs.second; return lhs; } template <class T> ostream &operator<<(ostream &os, const vector<T> &container) { for (auto &u : container) os << u << " "; return os; } template <class T, class U> ostream &operator<<(ostream &os, const pair<T, U> &p) { os << p.first << " " << p.second; return os; } #include <ext/pb_ds/assoc_container.hpp> // Common file #include <ext/pb_ds/tree_policy.hpp> // Including tree_order_statistics_node_update // #include <ext/pb_ds/detail/standard_policies.hpp> using namespace __gnu_pbds; using namespace std; template<typename T> using pb_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>; #if DEBUG #define error(args...) { string _s = #args; replace(_s.begin(), _s.end(), ',', ' '); stringstream _ss(_s); istream_iterator<string> _it(_ss); err(_it, args); } void err(istream_iterator<string>) {} template<typename T, typename... Args> void err(istream_iterator<string> it, T a, Args... args) { cerr << *it << " = " << a << endl; err(++it, args...); } #else #define error(...) do {} while (0) #endif template<typename T, typename U> pair<T, U> operator-(const pair<T, U> &l, const pair<T, U> &r) { return {l.first - r.first, l.second - r.second}; } template<typename T, typename U> pair<T, U> operator+(const pair<T, U> &l, const pair<T, U> &r) { return {l.first + r.first, l.second + r.second}; } #define _upgrade do { ios::sync_with_stdio(0); cin.tie(0); } while (0) typedef long long ll; typedef long double ld; typedef pair<int, int> pii; typedef pair<ll, ll> pll; const int N = 45; const int inf = 1<<30; int A[N]; int best[N]; ll best_cnt[N]; inline void count_inver(ll mask, int n) { int k = __builtin_popcountll(mask); int cnt = 0; int curr = best[k]; bitset<35> vis; For (i, n) { if (mask & (1LL << i)) { for (int j = A[i] + 1; j <= n; j++) { if (vis[j]) cnt++; if (cnt > curr) return; } vis[A[i]] = 1; } } if (cnt < curr) { best[k] = cnt; best_cnt[k] = 1; } else if (cnt == curr) { best_cnt[k]++; } } int main() { _upgrade; int n; cin >> n; For (i, n) cin >> A[i]; For (i, n + 1) best[i] = inf; for (ll i = 1; i < (1 << n); i++) count_inver(i, n); For (i, n) cout << best[i + 1] << " " << best_cnt[i + 1] << "\n"; } |