标签:
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