帮挂科

Time Limit: 2000/1000ms (Java/Others) 64bit IO Format: %lld & %llu

Problem Description:

冬瓜发现期末很多人都挂了线代,他决定写个程序帮挂科的同学。在一个排列中,如果一对数的前后位置与大小
顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数。
可是冬瓜想的头发都掉光了,聪明的你肯定能够帮帮他。

Input:

输入有多组
第1行:N,N为序列的长度(n <= 50000)
第2 - N + 1行:序列中的元素(0 <= A[i] <= 10^9)

Output:

输出逆序数

Sample Input:

4
2
4
3
1

Sample Output:

4
解题思路:这里用归并排序求逆序数。主要是将序列分成两部分,只要在有序的前半部分中找到的下标i比后半部分下标j大,那么下标i~m都可以构成逆序数对,即有(m-i+1)对,再合并子序列即可。。。
AC代码:
 #include<bits/stdc++.h>
using namespace std;
const int N=;
int ans,n,a[N],tmp[N];//tmp是临时数组
void _merge(int l,int m,int r)//合并子序列
{
int i=l,j=m+,k=l;
while(i<=m && j<=r){
if(a[i]>a[j]){
tmp[k++]=a[j++];//从小到大排列
ans+=m-i+;//只要a[i]>a[j],i~m都可以构成逆序数
}
else tmp[k++]=a[i++];//相等的就直接存放到临时数组
}
while(i<=m)tmp[k++]=a[i++];//剩余的直接拷贝
while(j<=r)tmp[k++]=a[j++];
for(int i=l;i<=r;++i)
a[i]=tmp[i];//临时数组赋值给a数组
}
void _merge_sort(int l,int r)//归并排序
{
if(l<r){
int m=(l+r)>>;//分成两部分
_merge_sort(l,m);//左递归
_merge_sort(m+,r);//右递归
_merge(l,m,r);//合并两部分
}
}
int main()
{
while(cin>>n){
for(int i=;i<n;++i)
cin>>a[i];
ans=;
_merge_sort(,n-);
cout<<ans<<endl;
}
return ;
}

ACM_逆序数(归并排序)的更多相关文章

  1. hdu 1394 Minimum Inversion Number (裸树状数组 求逆序数 && 归并排序求逆序数)

    题目链接 题意: 给一个n个数的序列a1, a2, ..., an ,这些数的范围是0-n-1, 可以把前面m个数移动到后面去,形成新序列:a1, a2, ..., an-1, an (where m ...

  2. HDU 4911 Inversion (逆序数 归并排序)

    Inversion 题目链接: http://acm.hust.edu.cn/vjudge/contest/121349#problem/A Description bobo has a sequen ...

  3. 51nod1019逆序数(归并排序/树状数组)

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1019 题意:中文题诶- 思路: 方法1:归并排序- 归并排序过 ...

  4. 51Nod 1019 逆序数 (归并排序)

    #include <iostream> #include <cstring> using namespace std; ; int a[maxn]; int res[maxn] ...

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

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

  6. poj 2299 逆序数

    http://poj.org/problem?id=2299 坑:答案是long long 输出……!!!!! 题意是:求一个数组进行冒泡排序交换的次数 题解:求逆序数 题解Ⅰ: 归并排序求逆序数 归 ...

  7. HDU 1394 Minimum Inversion Number(最小逆序数/暴力 线段树 树状数组 归并排序)

    题目链接: 传送门 Minimum Inversion Number Time Limit: 1000MS     Memory Limit: 32768 K Description The inve ...

  8. POJ 2299 Ultra-QuickSort 逆序数 树状数组 归并排序 线段树

    题目链接:http://poj.org/problem?id=2299 求逆序数的经典题,求逆序数可用树状数组,归并排序,线段树求解,本文给出树状数组,归并排序,线段树的解法. 归并排序: #incl ...

  9. poj 1804 (nyoj 117)Brainman : 归并排序求逆序数

    点击打开链接 Brainman Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 7810   Accepted: 4261 D ...

随机推荐

  1. c++之虚基类初始化

    C++虚基类构造函数下面文章详细介绍C++虚基,所谓C++虚基类:是由最派生类的构造函数通过调用虚基类的构造函数进行初始化的,但前提是要深入理解到底什么是C++虚基类,及他是怎么运行的. 前面讲过,为 ...

  2. 【Nginx】Nginx基础架构

    调用HTTP模块的流程: Worker进程会在一个for循环语句中反复调用事件模块检测网络事件.当事件模块检测到某个客户端发起的TCP请求时(接收到SYN包),将会为它建立TCP连接,成功建立连接后根 ...

  3. Cocos2d-x 3.1.1 学习日志12--一Cocos2dx3.1.1移植到Android平台的方法(最实用最有效的!!)

    须要用到工具(依照顺序): 1.JDK 2.NDK 3.ANT 4.Adt-bundle-windows 将JDK文件夹下的bin文件夹路径加入到系统环境变量中. 解压NDK 解压Adt-bundle ...

  4. LoadRunner系列实例之— 01录制cas登陆脚本

    关于CAS 的概念,见链接 需要增加4个关联函数,初次加载页面时取cookie和it1,输入账号密码点击登录时,取ticketGrantingTicketId和it2 实际上前后台完成两次交互, // ...

  5. xcode7 怎样真机測试

    1. 下载xcode7 能够通过訪问 https://developer.apple.com/xcode/downloads/ 下载最新的xcode7的版本号 只是官网的下载速度太慢了,这个最好百度一 ...

  6. Lnixu Bash

    一.简单命令 1.创建文件(vi) vi hellowold.txt2.创建目录(mkdir) mkdir linux_bash3.删除文件(rm) rm helloworld.txt4.复制文件(c ...

  7. 内存溢出-jvisualvm排查问题

    先来一段能够内存溢出的程序 public static void main(String[] args) { List<Object> list = new ArrayList<&g ...

  8. android 代码优化:关闭输出日志

    android关闭日志 我们在开发时,经常会输出各种日志来debug代码.但是等到应用发布的apk运行时不希望它输出日志. 关闭输出日志Log.v(),Log.i(),Log.w(),Log.v(), ...

  9. codeforces 686B B. Little Robber Girl's Zoo(水题)

    题目链接: B. Little Robber Girl's Zoo //#include <bits/stdc++.h> #include <vector> #include ...

  10. 【繁琐工作自动化】pandas 处理 excel 文件

    0. 一般处理 读取 excel 格式文件:df = pd.read_excel('xx.xlsx'),下面是一些简单查看文件内容的函数: df.head():展示前五行: df.columns:展示 ...