标签:
3 3 1 2
2
题解:求逆序数问题,我用树状数组和归并来做的,因为没有告诉编号范围,所以先离散化在做。例如:7,3,5,77离散化之后:3,1,2,4,他们的逆序数一样的。可以理解为将原来的数改成离散后的数。
树状数组:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #define mem(a) memset(a,0,sizeof(a)); using namespace std; struct Node { int pos; long long value; bool operator< (Node t) const { return value < t.value; } }; Node a[1000005]; int b[1000005]; int c[100005]; void update(int x,int n,int plus) { while(x <= n) { c[x] += plus; x += x & (-x); } } long long getSum(int x) { long long res = 0; while(x > 0) { res += c[x]; x -= x & (-x); } return res; } int main() { int n; while(scanf("%d",&n) != EOF) { for(int i = 1;i <= n;i++) { scanf("%d",&a[i].value); a[i].pos = i; } sort(a + 1,a + n + 1); for(int i = 1;i <= n;i++) { b[a[i].pos] = i; } mem(c); long long sum = 0; for(int i = 1;i <= n;i++) { update(b[i],n,1); sum += i - getSum(b[i]); } printf("%lld\n",sum); } return 0; }
归并:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #define mem(a) memset(a,0,sizeof(a)); using namespace std; struct Node { int pos; long long value; bool operator< (Node t) const { return value < t.value; } }; Node a[1000005]; int b[1000005]; int c[100005]; long long res; void merge(int l,int r) { int mid = (l + r) >> 1; int low = l; int high = mid + 1; int k = l; while(low <= mid && high <= r) { if(b[low] <= b[high]) { c[k++] = b[low++]; } else { c[k++] = b[high++]; res += mid - low + 1; } } for(int i = low;i <= mid;i++) { c[k++] = b[i]; } for(int i = high;i <= r;i++) { c[k++] = b[i]; } for(int i = l;i < k;i++) { b[i] = c[i]; } } void mergeSort(int l,int r) { if(l < r) { int mid = (l + r) >> 1; mergeSort(l,mid); mergeSort(mid + 1,r); merge(l,r); } } int main() { int n; while(scanf("%d",&n) != EOF) { for(int i = 1;i <= n;i++) { scanf("%d",&a[i].value); a[i].pos = i; } sort(a + 1,a + n + 1); for(int i = 1;i <= n;i++) { b[a[i].pos] = i; } res = 0; mergeSort(1,n); printf("%lld\n",res); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/wang2534499/article/details/47377535