poj 2299 Ultra-QuickSort 树状数组求逆序数
2015-04-10 15:07
369 查看
题意:n个数 通过两个相邻的数之间交换,求最小交换次数使n个数非递减(n<=500000,a[i]<=999999999)
a[i]比较大,要用下离散化 ,数据中没有重复的元素提交也对,一定要用long long
a[i]比较大,要用下离散化 ,数据中没有重复的元素提交也对,一定要用long long
#include<stdio.h> #include<cstring> #include<algorithm> using namespace std; #define N 500000+10 struct ln { int id; int va; }in ; int a ; int c ; int n; int cmp(ln x,ln y) { return x.va<y.va; } int lowbit(int x) { return x&(-x); } void updata(int t,int value) { for(int i=t;i<=n;i+=lowbit(i)) { c[i]+=value; } } int getSum(int x) { int temp=0; for(int i=x;i>=1;i-=lowbit(i)) { temp+=c[i]; } return temp; } int main() { while(scanf("%d",&n),n) { for(int i=1;i<=n;i++) { scanf("%d",&in[i].va); in[i].id=i; } memset(c,0,sizeof(c)); sort(in+1,in+n+1,cmp); a[in[1].id]=1; for(int i=2;i<=n;i++) { if(in[i].va!=in[i-1].va) a[in[i].id]=i; else a[in[i].id]=a[in[i-1].id]; } long long sum=0; for(int i=1;i<=n;i++) { updata(a[i],1); int tmp=i-getSum(a[i]-1); sum+=tmp-(getSum(a[i])-getSum(a[i]-1)); } printf("%lld\n",sum); } return 0; }
</pre><pre class="sh_cpp sh_sourceCode" style="font-size:14px; font-family: 'Courier New', Courier, monospace; background-color: white;">
相关文章推荐
- POJ2299 Ultra-QuickSort(树状数组求逆序数)
- poj 2299 Ultra-QuickSort 求逆序数 树状数组解法
- POJ 2299 Ultra-QuickSort【求逆序数:归并排序|树状数组】
- poj--2299 Ultra-QuickSort(树状数组求逆序数)
- poj 2299 Ultra-QuickSort (树状数组求逆序数)
- POJ 2299 -Ultra-QuickSort-树状数组求逆序数
- POJ 2299 Ultra-QuickSort 求逆序数 树状数组
- poj 2299 Ultra-QuickSort 求逆序数 树状数组解法
- POJ 2299 Ultra-QuickSort(树状数组入门) 求逆序数
- poj 2299 Ultra-QuickSort(树状数组求逆序数)
- poj 2299 Ultra-QuickSort(树状数组求逆序数)
- POJ 2299 Ultra-QuickSort(树状数组求逆序数)
- poj 2299 Ultra-QuickSort 树状数组求逆序数
- poj2299 Ultra-QuickSort(树状数组求逆序数,离散化)
- poj - 2299 - Ultra-QuickSort(树状数组)
- POJ 2299 Ultra-QuickSort(树状数组)
- POJ 2299 Ultra-QuickSort 【归并排序 || 树状数组求逆序对数】
- [树状数组]POJ 2299 Ultra-QuickSort
- poj 2299 Ultra-QuickSort(树状数组求逆序数+离散化)
- POJ 2299 Ultra-QuickSort(树状数组+离散化)