poj2299


/*树状数组求解逆序对
(1)对数据进行离散化
(2)构建树状数组求解逆序对*/
// poj2299逆序对_树状数组.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"#include <stdio.h>#include <algorithm>using namespace std;const int N = 500003;typedef struct Node{int value;int no;int tag;}Node;Node node[N], oriNode[N];int n;int sub[N];bool cmp1(Node m1, Node m2){return m1.value < m2.value;}bool cmp2(Node m1, Node m2){return m1.tag < m2.tag;}void serialize(){sort(node + 1, node + n + 1, cmp1);int cnt = 1;node[1].no = 1;for(int i = 2; i <= n; i++){if(node[i].value != node[i - 1].value)node[i].no = ++cnt;elsenode[i].no = node[i - 1].no;}sort(node + 1, node + n + 1, cmp2);}int lowbit(int x){return x & (-x);}void update(int pos, int inc){while(pos <= n){sub[pos] += inc;pos += lowbit(pos);}}int sum(int pos){int ret = 0;while(pos > 0){ret += sub[pos];pos -= lowbit(pos);}return ret;}int main(){while(~scanf("%d", &n) && n){memset(sub, 0, sizeof(sub));for(int i = 1; i <= n; i++){scanf("%d", &node[i].value);node[i].tag = i;}serialize();long long ans = 0;for(int i = 1; i <= n; i++){update(node[i].no, 1);ans += i - sum(node[i].no);}printf("%lld\n", ans);}return 0;}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值