方法一:树状数组
模板如下:
#include<iostream> #include<cstdio> #include <algorithm> using namespace std; const int MAXN=40001; int n, a[MAXN], tree[MAXN], tot; int lowbit(int x) { return x&-x; } int query(int x) { int ans=0; while (x>0) { ans+=tree[x]; x-=lowbit(x); } return ans; } void addz(int x) { while (x<=n) { tree[x]+=1; x+=lowbit(x); } return; } struct Node { int v, ord; bool operator < (const Node x) const { return v<x.v; } }node[MAXN]; int main() { scanf("%d", &n); for (int i=1; i<=n; i++) { scanf("%d", &node[i].v); node[i].ord=i; } sort(node+1, node+n+1 ); for (int i=1; i<=n; i++) a[node[i].ord]=i; for (int i=1; i<=n; i++) { addz(a[i]); tot+=i-query(a[i]); } printf("%d", tot); return 0; }
时间: 2024-11-05 22:55:28