poj 2488 排序交换数

来源:互联网 发布:淘宝定制t恤 编辑:程序博客网 时间:2024/06/12 19:49

直接模拟冒泡果断TLE

后来看别人的解释说采用归并排序

归并在逆序对计算中的便捷在于

合并过程中如果A数组中X大于B数组中Y,那么X后面的数字与Y都构成逆序对

#include <iostream>#include <vector>#include <map>#include <list>#include <set>#include <deque>#include <stack>#include <queue>#include <algorithm>#include <cmath>#include <cctype>#include <cstdio>#include <iomanip>#include <cmath>#include <cstdio>#include <iostream>#include <string>#include <sstream>#include <cstring>#include <queue>using namespace std;///宏定义const int INF = 20000000;const int MAXN = 500050;///全局变量 和 函数long long numbers[MAXN], t[MAXN];long long n;long long tot;//bool flag;//void Merge(int l, int m, int r){int p = 0;int i = l; int j = m + 1;while (i <= m && j <= r){//如果存在逆序对if (numbers[i] > numbers[j]){t[p++] = numbers[j++];tot += m - i + 1;//后面所有的都是逆序对}else{t[p++] = numbers[i++];}}while(i <= m) t[p++] = numbers[i++];while(j <= r) t[p++] = numbers[j++];for (i = 0; i < p; i++){numbers[l + i] = t[i];}}void MergeSort(int l, int r){int m;if (l < r){m = (l + r) / 2;MergeSort(l, m);MergeSort(m + 1, r);Merge(l, m, r);}}int main(){///变量定义int i, j;while (1){scanf("%lld", &n);if (n == 0)break;for (i = 0; i < n; i++)scanf("%lld", &numbers[i]);tot = 0;MergeSort(0, n - 1);printf("%lld\n", tot);}///结束return 0;}


原创粉丝点击