7 4 1 4 6 7 7 5
#include <bits/stdc++.h> using namespace std; #define ll long long ll a[2*100010], tree[2*100010]; int n; ll lowbits(ll x) { return x&(-x); } void update(int x) { while (x <= n) { tree[x]++; x += lowbits(x); } } int getsum(int x) { ll ans = 0; while(x) { ans += tree[x]; x -= lowbits(x); } return ans; } int main() { int t; cin >> t; while (t--) { cin >> n; for (int i = 1; i <= n; i++) { cin >> a[i]; tree[i] = 0; } ll sum = 0; for (int i = n; i >= 1; i--) { sum += getsum(a[i]); update(a[i]); } cout << sum << endl; } return 0; }
代码:从前往后遍历
#include <bits/stdc++.h> using namespace std; #define ll long long ll a[2*100010], tree[2*100010]; int n; //模板 ll lowbits(ll x) { return x&(-x); } void update(ll x) { while (x >=1) //之后链接的数 大于 x的 都+1 ,因为之后链接的上标记一定小于 i { tree[x]++; x -= lowbits(x); } } int getsum(int x) { ll ans = 0; while(x<=n) { ans += tree[x]; x += lowbits(x); } return ans; } // int main() { int t; cin >> t; while (t--) { cin >> n; for (int i = 1; i <= n; i++) { cin >> a[i]; tree[i] = 0; } ll sum = 0; for (int i = 1; i <= n; i++) { sum += getsum(a[i]); update(a[i]); } cout << sum << endl; } return 0; }