<pre name="code" class="cpp">//树状数组+离散化
//1.因为数据的范围比较大,要考虑离散化。2.还要考虑重复点的情况
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn = 70000;
struct p{
int v;
int id;
}a[maxn],b[maxn];
int bit[maxn];
int n;
void add(int i,int x){
while(i<=n){
bit[i] += x;
i += i&(-i);
}
}
ll sum(int x){
ll res=0;
x--;
while(x>0){
res += bit[x];
x -= x&(-x);
}
return res;
}
int cmp(const p&a, const p&b){
return a.v<b.v;
}
int cmp1(const p&a,const p&b){
return a.id<b.id;
}
int main()
{
int x,y;
while(~scanf("%d",&n)){
memset(bit,0,sizeof(bit));
for(int i=1;i<=n;++i){
scanf("%d",&a[i].v);
a[i].id=i;
}
sort(a+1,a+n+1,cmp);
a[0].v=-1;
int k=1;
for(int i=1;i<=n;++i){
if(a[i].v!=a[i-1].v){
b[i].v=k++;
b[i].id=a[i].id;
}
else {
b[i].v=b[i-1].v;
b[i].id=a[i].id;
}
}
sort(b+1,b+n+1,cmp1);
ll res=0;
for(int i=n;i>=1;--i){
res += sum(b[i].v);
add( b[i].v, 1 );
}
printf("%lld\n",res);
}
return 0;
}
SGU 180 Inversions
最新推荐文章于 2018-10-16 15:06:00 发布
