逆序数 归并

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int a[1001],t[10001],ans;
void Merge(int l,int m,int r)
{
    int i=l,j=m+1;
    int pos=l;
    while(i<=m && j<=r)
    {
        if(a[i] > a[j])
        {
            t[pos++]=a[j++];
            ans+=m-i+1;
        }
        else t[pos++]=a[i++];
    }
    while(i<=m) t[pos++]=a[i++];
    while(j<=r) t[pos++]=a[j++];
    for(int z=l;z<=r;z++) a[z]=t[z];
}
void merge_sort(int l,int r)
{
    if(l<r)
    {
        int m=(l+r)/2;
        merge_sort(l,m);
        merge_sort(m+1,r);
        Merge(l,m,r);
    }
}
int main()
{
    int t;
    cin>>t;
    for(int Case=1;Case<=t;Case++)
    {
        int n;
        cin>>n;
        for(int i=1;i<=n;i++) cin>>a[i];
        ans=0;
        merge_sort(1,n);
        printf("Scenario #%d:\n",Case);
        cout<<ans<<endl<<endl;
        //for(int i=1;i<=n;i++) cout<<a[i];
       // cout<<endl;
    }
    return 0;
}

http://poj.org/problem?id=1804

时间: 2024-10-07 02:19:44

逆序数 归并的相关文章

51 Nod 1107 斜率小于0的连线数量 (转换为归并求逆序数或者直接树状数组,超级详细题解!!!)

1107 斜率小于0的连线数量 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 二维平面上N个点之间共有C(n,2)条连线.求这C(n,2)条线中斜率小于0的线的数量. 二维平面上的一个点,根据对应的X Y坐标可以表示为(X,Y).例如:(2,3) (3,4) (1,5) (4,6),其中(1,5)同(2,3)(3,4)的连线斜率 < 0,因此斜率小于0的连线数量为2. Input 第1行:1个数N,N为点的数量(0 <= N <= 50000) 第2

2014多校第五场1001 || HDU 4911 Inversion (归并求逆序数)

题目链接 题意 : 给你一个数列,可以随意交换两相邻元素,交换次数不超过k次,让你找出i < j 且ai > aj的(i,j)的对数最小是多少对. 思路 : 一开始想的很多,各种都想了,后来终于想出来这根本就是求逆序数嘛,可以用归并排序,也可以用树状数组,不过我们用树状数组做错了,也不知道为什么.求出逆序数来再减掉k次,就可以求出最终结果来了.求逆序数链接1,链接2 1 #include <stdio.h> 2 3 int left[250003], right[250003];

hdu 1394 Minimum Inversion Number 归并求逆序数

Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 12107    Accepted Submission(s): 7388 Problem Description The inversion number of a given number sequence a1, a2, ..., a

HDU 6318 Swaps and Inversions 思路很巧妙!!!(转换为树状数组或者归并求解逆序数)

Swaps and Inversions Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2315    Accepted Submission(s): 882 Problem Description Long long ago, there was an integer sequence a.Tonyfang think this se

归并算法经典应用——求解逆序数

本文始发于个人公众号:TechFlow,原创不易,求个关注 在之前介绍线性代数行列式计算公式的时候,我们曾经介绍过逆序数:我们在列举出行列式的每一项之后,需要通过逆序数来确定这一项符号的正负性.如果有忘记的同学可以回到之前的文章当中复习一下: 线性代数行列式 如果忘记呢,问题也不大,这个概念比较简单,我想大家很快就能都搞清楚. 今天的这一篇文章,我想和大家聊聊逆序数的算法,也是一道非常经典的算法题,经常在各大公司的面试题当中出现. 我们先来回顾一下逆序数的定义,所谓逆序数指的是数组当中究竟存在多

逆序数 51nod 1019 归并 分治

在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序.一个排列中逆序的总数就称为这个排列的逆序数. 如2 4 3 1中,2 1,4 3,4 1,3 1是逆序,逆序数是4.给出一个整数序列,求该序列的逆序数. Input 第1行:N,N为序列的长度(n <= 50000) 第2 - N + 1行:序列中的元素(0 <= A[i] <= 10^9) Output 输出逆序数 Input示例 4 2 4 3 1 Output示例 4 看程序吧 不会讲

逆序数的求法总结(归并、线段树、树状数组、离散化)

1.归并排序求逆序数 http://acm.nyist.net/JudgeOnline/problem.php?pid=117 在归并排序的过程中,比较关键的是通过递归,将两个已经排好序的数组合并,此时,若a[i] > a[j],则i到m之间的数都大于a[j],合并时a[j]插到了a[i]之前,此时也就产生的m-i+1个逆序数,而小于等于的情况并不会产生. 1 #include<stdio.h> 2 #define maxn 1000005 3 int a[maxn],temp[maxn

归并排序_逆序数

归并排序求逆序数 在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序.一个排列中逆序的总数就称为这个排列的逆序数.一个排列中所有逆序总数叫做这个排列的逆序数.也就是说,对于n个不同的元素,先规定各元素之间有一个标准次序(例如n个 不同的自然数,可规定从小到大为标准次序),于是在这n个元素的任一排列中,当某两个元素的先后次序与标准次序不同时,就说有1个逆序.一个排列中所有逆序总数叫做这个排列的逆序数. 1 #include<cstdio> 2 #in

树状数组求逆序数 。,。 蓝桥杯 小朋友排队

先介绍一下树状数组.什么是树状数组呢?树状数组(Binary Indexed Tree(BIT), Fenwick Tree)是一个查询和修改复杂度都为log(n)的数据结构.主要用于查询任意两位之间的所有元素之和,但是每次只能修改一个元素的值:经过简单修改可以在log(n)的复杂度下进行范围修改,但是这时只能查询其中一个元素的值(如果加入多个辅助数组则可以实现区间修改与区间查询).(度娘万岁) 假设A[]数组为存储原来的值得数组,C[]为树状数组. 我们定义:C[i] = A[i - 2^k