#include <bits/stdc++.h> using namespace std; //#define int long long const bool debug = false; #define cerr if (!debug) {} else cout #define pisz(x) cerr << #x << ": " << x << endl; const int INF = numeric_limits<int>::max() - 10; int baza = 1; int drz[200]; int czytaj(int gdzie) { int res = 0; gdzie += baza; int kon = 2 * baza - 1; while (gdzie <= kon) { if (gdzie & 1) res += drz[gdzie]; gdzie = (gdzie + 1) >> 1; kon >>= 1; } return res; } void add(int gdzie) { gdzie += baza; while (gdzie) { drz[gdzie]++; gdzie >>= 1; } } void addMinus(int gdzie) { gdzie += baza; while (gdzie) { drz[gdzie]--; gdzie >>= 1; } } void init() { for (int i = 0; i < 2 * baza; i++) { drz[i] = 0; } } int tab[50]; pair<int, int> res[50]; int inw, ile; int n; void foo(int gdzie = 0) { if (gdzie == n) { if (inw < res[ile].first) res[ile] = {inw, 0}; if (inw == res[ile].first) res[ile].second++; return; } int pam = inw; foo(gdzie + 1); inw += czytaj(tab[gdzie]); add(tab[gdzie]); ile++; foo(gdzie + 1); addMinus(tab[gdzie]); ile--; inw = pam; } int32_t main() { ios_base::sync_with_stdio(0); cin.tie(0); //cout << sizeof(drz); return 0; cin >> n; for (int i = 0; i < n; i++) { cin >> tab[i]; res[i + 1] = {INF, 0}; } while (n + 1 >= baza) baza *= 2; /*for (int mask = 0; mask < (1 << n); mask++) { init(); int inw = 0; int ile = 0; for (int i = 0; i < n; i++) { if (mask & (1 << i)) { ile++; inw += czytaj(tab[i]); add(tab[i]); } } if (inw < res[ile].first) res[ile] = {inw, 0}; if (inw == res[ile].first) res[ile].second++; }*/ foo(); for (int i = 1; i <= n; i++) { cout << res[i].first << " " << res[i].second << "\n"; } return 0; } /* */
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 117 118 119 120 | #include <bits/stdc++.h> using namespace std; //#define int long long const bool debug = false; #define cerr if (!debug) {} else cout #define pisz(x) cerr << #x << ": " << x << endl; const int INF = numeric_limits<int>::max() - 10; int baza = 1; int drz[200]; int czytaj(int gdzie) { int res = 0; gdzie += baza; int kon = 2 * baza - 1; while (gdzie <= kon) { if (gdzie & 1) res += drz[gdzie]; gdzie = (gdzie + 1) >> 1; kon >>= 1; } return res; } void add(int gdzie) { gdzie += baza; while (gdzie) { drz[gdzie]++; gdzie >>= 1; } } void addMinus(int gdzie) { gdzie += baza; while (gdzie) { drz[gdzie]--; gdzie >>= 1; } } void init() { for (int i = 0; i < 2 * baza; i++) { drz[i] = 0; } } int tab[50]; pair<int, int> res[50]; int inw, ile; int n; void foo(int gdzie = 0) { if (gdzie == n) { if (inw < res[ile].first) res[ile] = {inw, 0}; if (inw == res[ile].first) res[ile].second++; return; } int pam = inw; foo(gdzie + 1); inw += czytaj(tab[gdzie]); add(tab[gdzie]); ile++; foo(gdzie + 1); addMinus(tab[gdzie]); ile--; inw = pam; } int32_t main() { ios_base::sync_with_stdio(0); cin.tie(0); //cout << sizeof(drz); return 0; cin >> n; for (int i = 0; i < n; i++) { cin >> tab[i]; res[i + 1] = {INF, 0}; } while (n + 1 >= baza) baza *= 2; /*for (int mask = 0; mask < (1 << n); mask++) { init(); int inw = 0; int ile = 0; for (int i = 0; i < n; i++) { if (mask & (1 << i)) { ile++; inw += czytaj(tab[i]); add(tab[i]); } } if (inw < res[ile].first) res[ile] = {inw, 0}; if (inw == res[ile].first) res[ile].second++; }*/ foo(); for (int i = 1; i <= n; i++) { cout << res[i].first << " " << res[i].second << "\n"; } return 0; } /* */ |