求逆序数

时间限制:2000 ms  |  内存限制:65535 KB
难度:5
 
描述

在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数。

现在,给你一个N个元素的序列,请你判断出它的逆序数是多少。

比如 1 3 2 的逆序数就是1。

 
输入
第一行输入一个整数T表示测试数据的组数(1<=T<=5)
每组测试数据的每一行是一个整数N表示数列中共有N个元素(2〈=N〈=1000000)
随后的一行共有N个整数Ai(0<=Ai<1000000000),表示数列中的所有元素。

数据保证在多组测试数据中,多于10万个数的测试数据最多只有一组。

输出
输出该数列的逆序数
样例输入
2
2
1 1
3
1 3 2
样例输出
0
1 归并排序执行过程:
          1、执行归并排序函数时,把全部的数字一分为二,继续递归调用函数自身,左一半右一半的划分开,直到每一份里只有一个元素为止,停止划分。
         2、把划分开的元素按照大小顺序排列,先 1 1,合并为个数为 2 的数组,再把 2 2 按顺序大小要求合并成个数为 4 的数组,依次进行把所有元素按大小排序
            两两合并时两序列均已是有序序列 如:
    4 1 3 10 7 3 5 0
    
    4 1 3 10 7 3 5 0     4 1 3 10 7 3 5 0     4 1 3 10 7 3 5 0 //每一组个数为 1 结束 合并:  1 4 3 10 3 7 0 5       1 3 4 10 0 3 5 7 最后结果:   0 1 3 3 4 5 7 10 本题利用归并时比较大小条件,因为两序列合并时都已经是有序的,所以一旦遇到前一个序列的a比后一个序列中的一个值大,那么前一个序列数的值a以后的数(包括a)都比后序列的值大,所以sum += (p3-s1+1); sum用long long. 代码如下:
 //归并排序

 #include <stdio.h>
#include <stdlib.h>
long long sum = ;
void mergesort(int a[],int ,int );
int main()
{
int a[];
int T,n,i;
scanf("%d",&T);
while(T--)
{
sum = ;
scanf("%d",&n);
for(i=;i<n;i++)
scanf("%d",&a[i]);
mergesort(a,,n-); printf("%lld\n",sum);
}
return ;
} void merge(int a[],int s1,int e1,int s2,int e2)
{
//s1-e1为左数组
//s2-e2为右数组
int j = ,i,p1 = s1,p2 = e2,p3 = e1;
int *temp = (int*)malloc(sizeof(int)*(e2-s1+)); while(s1 <= e1 && s2 <= e2)
{
if(a[s1] <= a[s2])
{
temp[j++] = a[s1++];continue;
}
else
{
sum += (p3-s1+);
temp[j++] = a[s2++];continue;
}
}
while(s1 <= e1)//如果左边还有
temp[j++] = a[s1++]; while(s2 <= e2)//如果右边还有
temp[j++] = a[s2++]; j = ;
for(i = p1;i <= p2;i++)//把排好序的数组存回原来的地方
a[i] = temp[j++]; delete temp;//记得释放指针
}
void mergesort(int a[],int left,int right)
{
//先一直拆分左边,知道拆分的只剩下一个元素为止,然后以一个元素为对称,右边也只有一个元素,然后合并两个元素
//一直这样向上合并,先1 1合并,然后2 2 合并 4 4..8 8..16 16...知道所有元素都已经合并完成
//带合并的两列数字都已经是有序的
int mid;
if(left < right)
{
mid = (left+right)/;
mergesort(a,left,mid);//左拆分
mergesort(a,mid+,right);//右拆分 merge(a,left,mid,mid+,right);//合并
}
}

归并排序及应用 (nyoj 117 求逆序数)的更多相关文章

  1. nyoj 117 求逆序数 (归并(merge)排序)

    求逆序数 时间限制:2000 ms  |  内存限制:65535 KB 难度:5   描述 在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序.一个排列中 ...

  2. NYOJ 117 求逆序数 (树状数组)

    题目链接 描述 在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序.一个排列中逆序的总数就称为这个排列的逆序数. 现在,给你一个N个元素的序列,请你判断出 ...

  3. poj 2299 Ultra-QuickSort :归并排序求逆序数

    点击打开链接 Ultra-QuickSort Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 34676   Accepted ...

  4. POJ 2299 Ultra-QuickSort 归并排序、二叉排序树,求逆序数

    题目链接: http://poj.org/problem?id=2299 题意就是求冒泡排序的交换次数,显然直接冒泡会超时,所以需要高效的方法求逆序数. 利用归并排序求解,内存和耗时都比较少, 但是有 ...

  5. [CF 351B]Jeff and Furik[归并排序求逆序数]

    题意: 两人游戏, J先走. 给出一个1~n的排列, J选择一对相邻数[题意!!~囧], 交换. F接着走, 扔一硬币, 若正面朝上, 随机选择一对降序排列的相邻数, 交换. 若反面朝上, 随机选择一 ...

  6. POJ2299 Ultra-QuickSort(归并排序求逆序数)

    归并排序求逆序数   Time Limit:7000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u   Descri ...

  7. POJ训练计划2299_Ultra-QuickSort(归并排序求逆序数)

    Ultra-QuickSort Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 39279   Accepted: 14163 ...

  8. HDU 3743 Frosh Week(归并排序求逆序数)

    归并排序求逆序数 #include <iostream> #include <cstdio> using namespace std; #define maxn 1000005 ...

  9. 求逆序数的方法--线段树法&归并排序法

    逆序数的概念:对于n个不同的元素,先规定各元素之间有一个标准次序(例如n个 不同的自然数,可规定从小到大为标准次序),于是在这n个元素的任一排列中,当某两个元素的先后次序与标准次序不同时,就说有1个逆 ...

随机推荐

  1. JQuery--计算元素的宽度

    /*width:只能计算元素的内容宽度 * innerWidth():可以获取元素的 内容+padding 的宽度 * outerWidth():可以获取元素的 内容+padding+border 的 ...

  2. Linux 基础命令3 shell

    echo 显示一行文本 各种展开的实例 波浪线展开 算术表达式展开 支持的运算 奇怪的花括号展开 花括号的..用法 花括号(任选一个)的嵌套 参数展开$符很重要哦(一种展开做另一种的参数) 命令的替换 ...

  3. day36 07-Hibernate抓取策略:many-to-one上的抓取策略

    package cn.itcast.test; import java.util.List; import org.hibernate.Hibernate; import org.hibernate. ...

  4. 【洛谷P2907】 【USACO08OPEN】农场周围的道路 水模拟分治

    P2907 [USACO08OPEN]农场周围的道路Roads Around The Farm 题目描述 Farmer John's cows have taken an interest in ex ...

  5. 设置Linux系统的空闲等待时间TMOUT的方法和Linux反空闲设置的两种方法

    为了增强linux系统的安全性,我们需要在用户输入空闲一段时间后自动断开,这个操作可以由设置TMOUT值来实现.将以下字段加入到/etc/profile 中即可(对所有用户生效). export TM ...

  6. JS方法大全

    方法:document.createElement(tagName) 说明:创建指定元素 方法:document.createTextNode(文本) 说明:创建文本节点 方法:_dom.append ...

  7. Javascript-随滚轮匀速滑动的浮动广告窗动画

    <!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/xhtml"> ...

  8. QT生成GUID

    #include <QCoreApplication> #include <QUuid> #include <QDebug> int main(int argc, ...

  9. CF981H K Paths

    CF981H K Paths 题解 一道不错的分治ntt题目 题目稍微转化一下,就是所有k条链的存在交,并且交的部分都被覆盖k次 所以一定是两个点,之间路径选择k次,然后端点两开花 f[x]表示x子树 ...

  10. 三分钟学会在ASP.NET Core MVC 中使用Cookie

    一.Cookie是什么? 我的朋友问我cookie是什么,用来干什么的,可是我居然无法清楚明白简短地向其阐述cookie,这不禁让我陷入了沉思:为什么我无法解释清楚,我对学习的方法产生了怀疑!所以我们 ...