标签:pre 坐标 lowbit mes lower ret ++ bsp name
其实一开始老师教我的时候是教的归并来着。
今天晚上想了想可以用树状数组维护前缀和做。
先排序一遍离散化出坐标,按顺序加入第i个数,查询前面比它大的数有多少个,就是逆数对了
# include <iostream> # include <cstdio> # include <cstring> # include <algorithm> using namespace std; int sum[100002]; int a[100002],b[100002],n; int lowbit(int k){ return k & -k; } void updata(int k,int data){ while(k <= n){ sum[k] += data; k += lowbit(k); } } int Sum(int k){ int ans = 0; while(k){ ans += sum[k]; k -= lowbit(k); } return ans; } int main(){ scanf("%d",&n); for(int i = 1;i <= n;i++){ scanf("%d",&a[i]); b[i] = a[i]; } sort(b + 1,b + n + 1); int ans = 0; for(int i = 1;i <= n;i++){ int k = lower_bound(b + 1,b + n + 1,a[i]) - b; updata(k,1); ans += i - Sum(k); } printf("%d\n",ans); }
标签:pre 坐标 lowbit mes lower ret ++ bsp name
原文地址:http://www.cnblogs.com/lzdhydzzh/p/7701337.html