#include <bits/stdc++.h> using namespace std; int n; int tree[50]; inline int lsb(int a) { return a & (-a); } void add_val(int val, int p) { while(p <= n) { tree[p] += val; p += lsb(p); } } int read_val(int p) { int ans = 0; while(p > 0) { ans += tree[p]; p -= lsb(p); } return ans; } pair<int, int> addPairs(pair<int, int> a, pair<int, int> b) { if(a.first == b.first) return {a.first, a.second + b.second}; return min(a, b); } vector<int> k; pair<int, int> theEnd[50]; int sum = 0; int numElems = 0; void dp(int p = 0) { if(p == n) { theEnd[numElems] = addPairs(theEnd[numElems], {sum, 1}); return; } dp(p + 1); add_val(1, k[p]); sum += read_val(k[p] - 1); ++numElems; dp(p + 1); sum -= read_val(k[p] - 1); add_val(-1, k[p]); --numElems; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> n; for(int i = 0; i < n; ++i) { int in; cin >> in; k.push_back(in); theEnd[i + 1] = {999999999, 0}; } reverse(k.begin(), k.end()); dp(); for(int i = 1; i <= n; ++i) { cout << theEnd[i].first << ' ' << theEnd[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 | #include <bits/stdc++.h> using namespace std; int n; int tree[50]; inline int lsb(int a) { return a & (-a); } void add_val(int val, int p) { while(p <= n) { tree[p] += val; p += lsb(p); } } int read_val(int p) { int ans = 0; while(p > 0) { ans += tree[p]; p -= lsb(p); } return ans; } pair<int, int> addPairs(pair<int, int> a, pair<int, int> b) { if(a.first == b.first) return {a.first, a.second + b.second}; return min(a, b); } vector<int> k; pair<int, int> theEnd[50]; int sum = 0; int numElems = 0; void dp(int p = 0) { if(p == n) { theEnd[numElems] = addPairs(theEnd[numElems], {sum, 1}); return; } dp(p + 1); add_val(1, k[p]); sum += read_val(k[p] - 1); ++numElems; dp(p + 1); sum -= read_val(k[p] - 1); add_val(-1, k[p]); --numElems; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> n; for(int i = 0; i < n; ++i) { int in; cin >> in; k.push_back(in); theEnd[i + 1] = {999999999, 0}; } reverse(k.begin(), k.end()); dp(); for(int i = 1; i <= n; ++i) { cout << theEnd[i].first << ' ' << theEnd[i].second << '\n'; } return 0; } |