Problem Description:

老师:“小明,写一个排序算法”;
小明:
void mysort(int a[],int n) //n为数组a的元素个数
{
int i,j;
for(j=0;j< n-1;j++)
for(i=0;i< n-1;i++)
{
if(a[i] >a[i+1])//数组元素大小按升序排列
{
swap(a[i],a[i+1]);//交换
}
}
}
老师:“好,那么,问题来了,给定一个数组,按你这个算法排序,需要的交换次数是多少?回答对了今天就可以不用滚出去。”
小明按他的这个算法试了一下,发现超时了,不想天天被老师叫滚出去,小明只好求助于你,你能帮助小明今天不用滚出去么?

Input:

输入包含多组数据(EOF),每组数据第一行是一个整数n(1<=n<=10^5),第二行有n个整数(<=10^5);

Output:

对于每组数据,输出小明排序算法的交换次数。

Sample Input:

3
1 3 2
5
5 4 3 2 1
4
1 2 3 4

Sample Output:

1
10
0
解题思路:求冒泡排序的交换次数其实就是求这个序列的逆序数,归并排序水过!
AC代码一之归并排序:
 #include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+;
typedef long long LL;
int n,a[maxn],tmp[maxn];LL ans;
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+=(LL)m-i+;}
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];
}
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(~scanf("%d",&n)){
for(int i=;i<n;++i)scanf("%d",&a[i]);
ans=;_merge_sort(,n-);
printf("%lld\n",ans);
}
return ;
}

AC代码二之树状数组:

 #include<bits/stdc++.h>
using namespace std;
const int maxn=;
typedef long long LL;
int n,val,aa[maxn],tar[maxn];
struct node{int val,id;}nod[maxn];
bool cmp(node a,node b){return a.val<b.val;}
int lowbit(int x){return x & -x;}
void update(int x,int val){
while(x<=n){aa[x]+=val;x+=lowbit(x);}
}
int getsum(int x){
int ret=;
while(x>){ret+=aa[x];x-=lowbit(x);}
return ret;
}
int main(){
while(cin>>n){
LL ans=;
memset(aa,,sizeof(aa));
for(int i=;i<=n;++i){cin>>nod[i].val;nod[i].id=i;}
sort(nod+,nod+n+,cmp);
for(int i=;i<=n;++i)tar[nod[i].id]=i;
for(int i=;i<=n;++i){update(tar[i],);ans+=i-getsum(tar[i]);}
cout<<ans<<endl;
}
return ;
}

ACM_小明滚出去?(求逆序数)的更多相关文章

  1. nyoj117 求逆序数

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

  2. poj 2299 Ultra-QuickSort (归并排序 求逆序数)

    题目:http://poj.org/problem?id=2299 这个题目实际就是求逆序数,注意 long long 上白书上的模板 #include <iostream> #inclu ...

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

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

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

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

  5. 线段树求逆序数方法 HDU1394&amp;&amp;POJ2299

    为什么线段树能够求逆序数? 给一个简单的序列 9 5 3 他的逆序数是3 首先要求一个逆序数有两种方式:能够从头開始往后找比当前元素小的值,也能够从后往前找比当前元素大的值,有几个逆序数就是几. 线段 ...

  6. CF 61E 树状数组+离散化 求逆序数加强版 三个数逆序

    http://codeforces.com/problemset/problem/61/E 题意是求 i<j<k && a[i]>a[j]>a[k] 的对数 会 ...

  7. poj 2229 Ultra-QuickSort(树状数组求逆序数)

    题目链接:http://poj.org/problem?id=2299 题目大意:给定n个数,要求这些数构成的逆序对的个数. 可以采用归并排序,也可以使用树状数组 可以把数一个个插入到树状数组中, 每 ...

  8. HDU 1394 Minimum Inversion Number (线段树 单点更新 求逆序数)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 题意:给你一个n个数的序列,当中组成的数仅仅有0-n,我们能够进行这么一种操作:把第一个数移到最 ...

  9. hdu1394--Minimum Inversion Number(线段树求逆序数,纯为练习)

    Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Ot ...

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

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

随机推荐

  1. centOS Linux下用yum安装mysql

    centOS Linux下用yum安装mysql      第一篇:安装和配置MySQL   第一步:安装MySQL   [root@192 local]# yum -y install mysql- ...

  2. 栈和队列问题:设计一个有 getMin 功能的栈

    [知识点] 栈是一个先进后出(FILO-First In Last Out)的数据结构,队列是一种先进先出(FIFO-First In First Out)的数据结构. [题目] 实现一个特殊的栈,在 ...

  3. Spring MVC 笔记 概述

    学习笔记 模型:封装装程序数据 视图:渲染模型数据,一般来说就是输出HTML 控制:处理请求,构建模型并将其传递给视图进行渲染 以上三者均围绕DispatcherServlet设计,它处理所有的HTT ...

  4. Problem 56

    Problem 56 https://projecteuler.net/problem=56 Powerful digit sum A googol (10100) is a massive numb ...

  5. Codeforces 918D/917B - MADMAX

    传送门:http://codeforces.com/contest/918/problem/D 本题是一个组合游戏问题——DAG上的动态规划问题. 有一张有向无环图(DAG).有两个玩家在这张图上进行 ...

  6. C#关键字详解第一节

    abstract:抽象类: 他表达对问题或者实际中的事物,对象等所设计出的抽象概念,比如一个灵感.生物等,这些都是抽像, 但是他们往往也有具体的指向,比如生物圈有人类,猴子,老虎等等,老虎和人类是实际 ...

  7. 【Codeforces 467C】George and Job

    [链接] 我是链接,点我呀:) [题意] 让你从1..n这n个数字中 选出来k个不相交的长度为m的区间 然后这个k个区间的和最大 求出这k个区间的和的最大值 [题解] 设dp[i][j]表示前i个数字 ...

  8. Linux系统自带服务罗列

    /ect/services 文件列出了系统详细的服务 红色字体为常用服务 acpid ACPI(全称 Advanced Configuration and Power Interface)服务是电源管 ...

  9. Pycharm 的基本操作

    下载:https://www.jetbrains.com/pycharm/ 安装:随意安装在那个目录都可以 注册:可以采用 激活码 或者激活服务器,并对应在选项下面填入激活码或者激活服务器URL即可. ...

  10. [HEOI 2016] sort

    [HEOI 2016] sort 解题报告 码线段树快调废我了= = 其实这题貌似暴力分很足,直接$STL$的$SORT$就能$80$ 正解: 我们可以二分答案来做这道题 假设我们二分的答案为$a$, ...