50分求助
  • 板块P1908 逆序对
  • 楼主hhyj
  • 当前回复1
  • 已保存回复1
  • 发布时间2022/1/29 11:38
  • 上次更新2023/10/28 10:26:03
查看原帖
50分求助
418541
hhyj楼主2022/1/29 11:38
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#define lowbit(x) ((x) & (-x))
using namespace std;

const int N = 500005;
int a[N], b[N], l[N], tr[N], n;

void add(int x, int c) {
    for (int i = x; i <= n; i += lowbit(i))
        tr[i] += c;
}

int sum(int x) {
    int res = 0;
    for (int i = x; i; i -= lowbit(i))
        res += tr[i];
    return res;
}

int main()
{
    cin >> n;
    for (int i = 0; i < n; i ++) scanf("%d", &a[i]);

    memcpy(b, a, sizeof a);
    sort(b, b + n);
    int len = unique(b, b + n) - b;
    for (int i = 0; i < n; i ++)
        l[i] = lower_bound(b, b + len, a[i]) - b + 1;

    int ans = 0;
    for (int i = n-1; i >= 0; i--) {
        ans += sum(l[i]-1);
        add(l[i], 1);
    }

    cout << ans;

    return 0;
}
2022/1/29 11:38
加载中...