/********************
* Author:fisty
* Data:2014-12-8
* poj2299
* 树状数组求逆序数+离散化
*********************/
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
#define MAX_N 599999
typedef long long ll;
int bit[MAX_N], vec[MAX_N];
int n;
struct node{
int v;
int id;
}a[500100];
int sum(int i){
int sum = 0;
while(i > 0){
sum += bit[i];
i -= (i&(-i));
}
return sum;
}
void add(int i, int x){
while(i <= MAX_N){
bit[i] += x;
i += (i&(-i));
}
}
bool cmp(struct node t1, struct node t2){
return t1.v < t2.v;
}
void solve(){
ll ans = 0;
for(int i = 1;i <= n; i++){
add(vec[i], 1);
ans += i - sum(vec[i]);
}
printf("%lld\n", ans);
}
int main(){
while(scanf("%d", &n) && n){
for(int i = 1;i <= n; i++){
scanf("%d", &a[i].v);
a[i].id = i;
}
memset(bit , 0, sizeof(bit));
sort(a+1, a + n + 1, cmp);
//离散化
for(int i = 1;i <= n; i++){
vec[a[i].id] = i;
}
solve();
}
return 0;
}
poj2299 离散化+树状数组
最新推荐文章于 2019-09-16 22:48:47 发布