poj2299 离散化+树状数组

来源:互联网 发布:中档女装品牌 知乎 编辑:程序博客网 时间:2024/05/20 01:47
/******************** * Author:fisty * Data:2014-12-8 * poj2299 * 树状数组求逆序数+离散化 *********************/#include <cstdio>#include <cstring>#include <vector>#include <algorithm>using namespace std;#define MAX_N 599999typedef 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;}


0 0
原创粉丝点击