//归并排序

//#include<stdio.h>

//#include<string.h>

//#include<algorithm>

//#include<iostream>

//using namespace std;

//

//int n,m;

//int a[10],b[10];

//

//void merge_sort(int* A,int x,int y,int* T)

//{

//    if(y-x>1)

//    {

//        int m=(y-x)/2+x;

//        int p=x,q=m,i=x;

//        merge_sort(A,x,m,T);

//        merge_sort(A,m,y,T);

//        while(p<m||q<y)

//        {

//            if(q>=y||p<m&&A[p]<=A[q]) T[i++]=A[p++];//一石二鸟,控制左边和右边

//            else T[i++]=A[q++];

//        }

//        for(i=x; i<y; i++) A[i]=T[i];

//    }

//}

//

//int main()

//{

//    scanf("%d",&n);

//    while(n--)

//    {

//        int i,j;

//        memset(b,0,sizeof(b));

//        scanf("%d",&m);

//        for(i=0; i<m; i++)

//            scanf("%d",&a[i]);

//        merge_sort(a,0,m,b);

//        for(i=0; i<m; i++)

//            printf("%d ",a[i]);

//        printf("\n");

//    }

//    return 0;

//}









//给出一列数a1,a2,a3....an,求它们的逆序对数,即有多少个有序对(i,j)

//使得i<j,ai>aj,n高达10的6次方 

//思路:

//和归并排序一样,划分和递归求解都好办,关键在于合并;如何求出i在左边

//而j在右边的逆序对数呢?统计的常见技巧是"分类",我们按照j的不同把这些

//"跨越两边"的逆序对进行分类;只要对于右边的每个j,统计左边比它大的元素个数f(j)

//则所有f(j)的和就是答案

//幸运的是归并排序可以帮我们"顺便"完成f(j)的计算;由于合并操作是从小到大进行的

//当右边的A[j]复制到T中时,左边还没来得及辅助到T的那些数就是左边所有比A[j]大的数

//此时在累加器中加上左边元素个数m-p即可(左边所剩的元素在区间[p,m)中,因此个数是m-p)

//换句话说就是把"else T[i++]=A[q++]"改成"else{T[i++]=A[q++];cnt+=m-p;".注意cnt要清零

#include<stdio.h>

#include<string.h>

#include<algorithm>

#include<iostream>

using namespace std;





int n,m;

int cnt;

int a[10],b[10];





void merge_sort(int* A,int x,int y,int* T)

{

    cnt=0;

    if(y-x>1)

    {

        int m=(y-x)/2+x;

        int p=x,q=m,i=x;

        merge_sort(A,x,m,T);

        merge_sort(A,m,y,T);

        while(p<m||q<y)

        {

            if(q>=y||p<m&&A[p]<=A[q]) T[i++]=A[p++];

            else

            {

                T[i++]=A[q++];

                cnt+=m-p;

            }

        }

        for(i=x; i<y; i++) A[i]=T[i];

    }

}





int main()

{

    scanf("%d",&n);

    while(n--)

    {

        int i;

        memset(b,0,sizeof(b));

        scanf("%d",&m);

        for(i=0; i<m; i++)

            scanf("%d",&a[i]);

        merge_sort(a,0,m,b);

        for(i=0; i<m; i++)

            printf("%d ",a[i]);

        printf("\n");

        printf("%d\n",cnt);

    }

    return 0;

}

给出一列数a1,a2,a3....an,求它们的逆序对数,即有多少个有序对(i,j) 使得iaj,n高达10的6次方的更多相关文章

  1. //给定N个整数序列{A1,A2,A3...An},求函数f(i,j)=(k=i~j)Ak的求和

    //给定N个整数序列{A1,A2,A3...An},求函数f(i,j)=(k=i~j)Ak的求和 # include<stdio.h> void main() { ,sum1; ]={,- ...

  2. 如何生成a1,a2,a3,a4这样的变量名

    var num=6; function Girl(beautifulScore){ this.beautifulScore=beautifulScore; } var girls=[]; for (v ...

  3. 给定一个数列a1,a2,a3,...,an和m个三元组表示的查询,对于每个查询(i,j,k),输出ai,ai+1,...,aj的升序排列中第k个数。

    给定一个数列a1,a2,a3,...,an和m个三元组表示的查询,对于每个查询(i,j,k),输出ai,ai+1,...,aj的升序排列中第k个数. #include <iostream> ...

  4. 已知一个序列A1.A2….An,给你一个整数K,找到满足所有Ai+Aj>=k的数对(i,j)的个数

    #include<bits/stdc++.h> using namespace std; #define ll long long #define maxn 100010 /* 已知一个序 ...

  5. 有a1,a2,a3,a4,四个数组,四个数组重新组合成一个数组(A),间隔是10个元素

    好久没折腾Py了,这是去年年初2019.3月发在Q中的一个记录,因不从事这个,并且被在工厂耽误10几年,所以很少写Blog在这里,感觉这里比较正式,而在Q中只是随意性的记载, 但发布图片总是需要另外再 ...

  6. 用VBA计算WPS 表格ET EXCEL中的行数和列数的多重方法

    用VBA计算WPS 表格ET EXCEL中的行数和列数 每种方法中上面的是Excel的行数,下面的是Excel的列数. 方法1: ActiveSheet.UsedRange.Rows.Count Ac ...

  7. VBA取得EXCEL表格中的行数和列数

    VBA取得EXCEL表格中的行数和列数 初学EXCEL宏的童鞋,总是很想知道表格中含有数据的行数和列数,尤其是行数和列数不确定的情况下.这样可以避免很多的错误,并且可以提高效率.但每次用到的时候到网上 ...

  8. C# 得到EXCEL表格中的有效行数和列数

    每种方法中上面的是Excel的行数,下面的是Excel的列数.方法七:经过加工修改已经可以读出来的是有效数据行 using Excel = Microsoft.Office.Interop.Excel ...

  9. Office EXCEL VBA如何取得EXCEL中的行数和列数

    VBA取得EXCEL表格中的行数和列数 请注意不要使用Columus等关键字作为变量,例如"Columus = ActiveSheet.UsedRange.Columns.Count&quo ...

随机推荐

  1. Map总结

    Map是键值对集合,是一对一对往上存的,要保持键的唯一性 形式:Map<K, V> 方法: 增 put(K key, V value) 若存储时Map中有相同的键,则返回原来键的值,并覆盖 ...

  2. 【51nod】1222 最小公倍数计数 莫比乌斯反演+组合计数

    [题意]给定a和b,求满足a<=lcm(x,y)<=b && x<y的数对(x,y)个数.a,b<=10^11. [算法]莫比乌斯反演+组合计数 [题解]★具体 ...

  3. 关于Http协议、ASP.NET 核心知识(2)

    简介HTTP (对于http协议的描述我前部分有写,但基于保证文档独立完整性的原则,我再写一遍.反正又不花钱.) 这货的学名叫:超文本传输协议 英文名字:(HTTP,HyperText Transfe ...

  4. layui利用jQuery设置下拉列表的值

    今天在利用jQuery动态设置下拉列表的值的时候确怎么也赋值不上去,其中用到了layui框架,源代码如下: $.post(contextPath+'/courseLibrary/getCourseBa ...

  5. 超级ping(多线程版)

    发现学校公共wifi的ip段是10.1.0-255.0-255段的,还是之前的思路批量ping一波. 其实可以使用nmap的.但是脚本写都写了.是吧.你懂的. #!/usr/bin/env pytho ...

  6. 日常开发技巧:x11-forward,使用远程机器的gui程序

    背景 日常用过ssh登录服务器进行工作,尽管大部分时间,都只需要终端操作,编辑源码也是vim就够用了. 但有时候,还是需要使用gui程序的,比如打开一份pdf,word,ppt,excel等. 碰到这 ...

  7. UVA题解三

    UVA题解三 UVA 127 题目描述:\(52\)张扑克牌排成一列,如果一张牌的花色或者数字与左边第一列的最上面的牌相同,则将这张牌移到左边第一列的最上面,如果一张牌的花色或者数字与左边第三列的最上 ...

  8. myeclipse/eclipse安装反编译插件jadclipse

    jad是一个使用比较广泛的Java反编译软件,jadClipse是jad在eclipse下的插件,下面像大家介绍下如何将jadclipse加入到myeclipse/eclipse中. 文件下载 (1) ...

  9. C/C++——static修饰符

    1. static变量 static 用来说明静态变量.如果是在函数外面定义的,那么其效果和全局变量类似,但是,static定义的变量只能在当前c程序文件中使用,在另一个c代码里面,即使使用exter ...

  10. Python模块之pxssh

    pxssh模块用于在python中ssh远程连接,执行命令,返回结果,但注意不支持Windows系统 #!/usr/bin/env python #-*- coding:utf-8 -*- from ...