voidadd(int x, int v){ for (; x <= n; x += x & (-x)) { su[x] += v; } }
intquery(int x){ int res = 0; for (; x; x &= x - 1) { res += su[x]; } return res; } };
longlongsolve(const vector<int>& nums){ vector<int> sorted(nums); sort(sorted.begin(), sorted.end()); sorted.erase(unique(sorted.begin(), sorted.end()), sorted.end()); unordered_map<int, int> ids; int m = sorted.size(); for (int i = 0; i < m; ++i) { // Reverse the order. // Now a smaller id means a larger element. ids[sorted[i]] = m - i; } // Main part. BIT bit(m); longlong res = 0; for (int num : nums) { int id = ids[num]; // Get inversion pair (i,j) with j the current element. // Namely, count the number of elements larger than // the current one but located before it. res += bit.query(id - 1); // Insert the current element to the BIT. bit.add(id, 1); } return res; }
#include<bits/stdc++.h> #include<cstdio> using ll = longlong; usingnamespace std; ll n, k;
classBIT { int n; std::vector<int> su;
public: BIT(int n) : n(n), su(n + 1) {}
voidfill(){ for (int x = 1; x <= n; ++x) { su[x] += x & (-x); } }
voidadd(int x, int v){ for (; x <= n; x += x & (-x)) { su[x] += v; } } intquery(int x){ int res = 0; for (; x; x &= x - 1) { res += su[x]; } return res; }
intfind_kth(int k){ int ps = 0, x = 0; for (int i = log2(n); i >= 0; --i) { x += 1 << i; if (x >= n || ps + su[x] >= k) { x -= 1 << i; } else { ps += su[x]; } } return x + 1; } }; // 给定排名求对应排列 voidP(){ ll a; cin >> a; a--; vector<ll> lehmer(n); for (int i = 1; i<=n; i++){ lehmer[n-i] = a%i; a/=i; } BIT bit(n); bit.fill(); vector<ll> re(n);
for (int i = 0; i<n; i++){ re[i] = bit.find_kth(lehmer[i]+1); bit.add(re[i],-1); } for (auto it: re) cout << it <<" "; cout << endl; } // 给定排列求对应排名 voidQ(){ vector<ll> q(n); for (int i = 0; i<n; i++){ cin >> q[i]; } BIT bit(n); ll fac = 1; ll res = 0; for (int i = n-1; i>=0; i--){ res+=bit.query(q[i]-1)*fac; bit.add(q[i],1); fac*=(n-i); } cout << res+1<<endl; } intmain(){ cin >> n >> k; while(k--){ char op; cin >> op; if (op=='P') P(); elseQ(); } }