Ultra-QuickSort(树状数组+离散化) POJ - 2299
Posted whhh
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ultra-QuickSort(树状数组+离散化) POJ - 2299相关的知识,希望对你有一定的参考价值。
给一个序列,我们使用冒泡排序法对它进行排序。请输出在排序过程中会进行多少次交换。
参考大佬:https://www.cnblogs.com/shenshuyang/archive/2012/07/14/2591859.html
#define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<cstring> #include<stdio.h> #include<algorithm> #include<map> #include<queue> #include<set> #include <sstream> #include<vector> #include<cmath> #include<stack> #include<time.h> #include<ctime> using namespace std; #define inf 1<<30 #define eps 1e-7 #define LD long double #define LL long long #define maxn 1000005 struct node { int v, f; }b[maxn]; int aa[maxn], c[maxn], n; bool cmp(node A, node B) { return A.v < B.v; } int low(int x) { return x & (-x); } void updata(int p, int q) { while (p <= n) { c[p] += q; p += low(p); } } int sum(int p) { int ans = 0; while (p > 0) { ans += c[p]; p -= low(p); } return ans; } int main() { while (~scanf("%d", &n) ) { if (n == 0)break; int i; LL ans = 0; for (i = 1; i <= n; i++) { scanf("%d", &b[i].v); b[i].f = i; } sort(b + 1, b+n+1, cmp); for (i = 1; i <= n; i++) { aa[b[i].f] = i; } memset(c, 0, sizeof(c)); for (i = 1; i <= n; i++) { updata(aa[i], 1); ans += i - sum(aa[i]); } printf("%lld ", ans); } }
以上是关于Ultra-QuickSort(树状数组+离散化) POJ - 2299的主要内容,如果未能解决你的问题,请参考以下文章
ZOJ-2386 Ultra-QuickSort 树状数组求逆序数+离散化
POJ 2299 Ultra-QuickSort (树状数组+离散化 求逆序数)
poj 2299 Ultra-QuickSort(树状数组求逆序数+离散化)
Ultra-QuickSort(树状数组+离散化) POJ - 2299