SDUT-数据结构实验之排序五:归并求逆序数

news/2024/5/17 15:59:56 标签: 归并排序

数据结构实验之排序五:归并求逆序数

Time Limit: 50MS  Memory Limit: 65536KB
Submit  Statistic  Discuss

Problem Description

对于数列a1,a2,a3…中的任意两个数ai,aj (i < j),如果ai > aj,那么我们就说这两个数构成了一个逆序对;在一个数列中逆序对的总数称之为逆序数,如数列 1 6 3 7 2 4 9中,(6,4)是一个逆序对,同样还有(3,2),(7,4),(6,2),(6,3)等等,你的任务是对给定的数列求出数列的逆序数。

Input

输入数据N(N <= 100000)表示数列中元素的个数,随后输入N个正整数,数字间以空格间隔。

 

Output

输出逆序数。

Example Input

10
10 9 8 7 6 5 4 3 2 1

Example Output

45

Hint

Author

xam

本部分学习:mooc视频

#include <bits/stdc++.h>
using namespace std;
int a[100000+5],temp[100000+5];
long long int ans;
void Merge(int s1,int d1,int s2,int d2)
{
    int f1=s1,f2=s2,k=0,i;
    while(f1<=d1&&f2<=d2)
    {
     if(a[f1]<=a[f2])
         temp[k++]=a[f1++];
     else
     {
         temp[k++]=a[f2++];
         ans+=d1-f1+1;///结合if的判断条件,此时从f1到a1的a[]数组中的数都大于a[f2],所以它们都是a[f2]的逆序数
     }
    }
    while(f1<=d1)///注意是小于等于,可能f1已经大于a1,会导致错误
    {
        temp[k++]=a[f1++];
    }
     while(f2<=d2)///注意是小于等于,可能f2已经大于a2,会导致错误
    {
        temp[k++]=a[f2++];
    }
    for(i=s1;i<=d2;i++)///注意a[i]只从s1更新到d2,而不是0到k
    {
        a[i]=temp[i-s1];
    }
}
void Msort(int s,int d)
{
    int mid;
    if(s<d)
    {
        mid=(s+d)/2;
        Msort(s,mid);
        Msort(mid+1,d);
        Merge(s,mid,mid+1,d);
    }
}
int main()
{
    int n,i;
    scanf("%d",&n);
    ans=0;
    for(i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    Msort(0,n-1);
    printf("%lld\n",ans);
    return 0;
}





http://www.niftyadmin.cn/n/1185989.html

相关文章

SDUT-3404 数据结构实验之排序七:选课名单(快排)

数据结构实验之排序七&#xff1a;选课名单Time Limit: 1000MS Memory Limit: 65536KBSubmit Statistic DiscussProblem Description随着学校规模的扩大&#xff0c;学生人数急剧增加&#xff0c;选课名单的输出也成为一个繁重的任务&#xff0c;我校目前有在校生3万多名&#…

POJ-棋盘问题

棋盘问题Time Limit: 1000MS Memory Limit: 10000KTotal Submissions: 49502 Accepted: 23966Description在一个给定形状的棋盘&#xff08;形状可能是不规则的&#xff09;上面摆放棋子&#xff0c;棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列&a…

POJ-3984迷宫问题 (BFS,水题)

迷宫问题Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 24199 Accepted: 14125Description定义一个二维数组&#xff1a; int maze[5][5] {0, 1, 0, 0, 0,0, 1, 0, 1, 0,0, 0, 0, 0, 0,0, 1, 1, 1, 0,0, 0, 0, 1, 0,};它表示一个迷宫&#xff0c;其中的1表示墙壁…

SDUT-2121 数据结构实验之链表六:有序链表的建立

数据结构实验之链表六&#xff1a;有序链表的建立Time Limit: 1000MS Memory Limit: 65536KBSubmit StatisticProblem Description输入N个无序的整数&#xff0c;建立一个有序链表&#xff0c;链表中的结点按照数值非降序排列&#xff0c;输出该有序链表。Input第一行输入整数个…

SDUT-3331 数据结构实验之链表八:Farey序列

数据结构实验之链表八&#xff1a;Farey序列Time Limit: 10MS Memory Limit: 600KBSubmit Statistic DiscussProblem DescriptionFarey序列是一个这样的序列&#xff1a;其第一级序列定义为&#xff08;0/1&#xff0c;1/1&#xff09;&#xff0c;这一序列扩展到第二级形成序列…

SDUT-2132 数据结构实验之栈与队列二:一般算术表达式转换成后缀式

数据结构实验之栈与队列二&#xff1a;一般算术表达式转换成后缀式Time Limit: 1000MS Memory Limit: 65536KBSubmit StatisticProblem Description对于一个基于二元运算符的算术表达式&#xff0c;转换为对应的后缀式&#xff0c;并输出之。Input输入一个算术表达式&#xff0…

SDUT-2133 数据结构实验之栈与队列三:后缀式求值

数据结构实验之栈与队列三&#xff1a;后缀式求值Time Limit: 1000MS Memory Limit: 65536KBSubmit StatisticProblem Description对于一个基于二元运算符的后缀表示式&#xff08;基本操作数都是一位正整数&#xff09;&#xff0c;求其代表的算术表达式的值。Input输入一个算…

SDUT-3333 数据结构实验之栈与队列六:下一较大值(二)

数据结构实验之栈与队列六&#xff1a;下一较大值&#xff08;二&#xff09;Time Limit: 150MS Memory Limit: 8000KBSubmit StatisticProblem Description对于包含n&#xff08;1<n<100000&#xff09;个整数的序列&#xff0c;对于序列中的每一元素&#xff0c;在序列…