XidianOJ 1024 简单逆序对

Posted TOTOTOTOTZZZZZ

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XidianOJ 1024 简单逆序对相关的知识,希望对你有一定的参考价值。

题目描述

逆序对问题对于大家来说已经是非常熟悉的问题了,就是求i<j时,a[i] > a[j]的组数。现在请你求出一串数字中的逆序对的个数,需要注意的是,这些数字均在[0,9]之内。

 

输入

第一行输入T,表示有T组测试数据
对于每组数据,首先输入n,代表有n个数(0<n<=10^6)
接下来输入n个数,每个数都在[0,9]之内

 

输出

输出逆序对的个数,且对10^9+7取模

--正文

使用的是归并排序求逆序对,其实还有很多种

PS: 打10^9的时候老是不小心多打个0少打个0,WA了半天,诶

#include <stdio.h>

int a[1000001];
int tempa[1000001];
long long total = 0;
void merge(int left,int mid,int right){
    int endl = mid - 1,endr = right;
    int L = left,R = mid;
    int Tmp = left;
    int NumElements = right - left + 1; 
    while (L<= endl && R <= endr) {
        if (a[L] <= a[R]) {
            tempa[Tmp++] = a[L++];
        }
        else {
            total += endl - L + 1;
            tempa[Tmp++] = a[R++];
        }
    } 
    while (L<=endl){
        tempa[Tmp++] = a[L++];
    }
    while (R<=endr){
        tempa[Tmp++] = a[R++];
    }
    int i;
    for (i=0;i<=NumElements;i++,endr--){
        a[endr] = tempa[endr];
    }
}

void mergesort(int left,int right){
    int mid = (left + right) / 2;
    if (left < right){
        mergesort(left,mid);
        mergesort(mid+1,right);
        merge(left,mid+1,right);
    }
} 

int main() {
    int time,T;
    scanf("%d",&T);
    for (time=1;time<=T;time++){
        int n;
        scanf("%d",&n);
        int i;
        for (i=1;i<=n;i++){
            scanf("%d",&a[i]);
        }
        total = 0;
        mergesort(1,n); 
        printf("%lld\n",total % 1000000007);
    }
    
    return 0;
}

 

以上是关于XidianOJ 1024 简单逆序对的主要内容,如果未能解决你的问题,请参考以下文章

1024. 视频拼接 dp

XidianOJ 1035 数独 && 1053 正数负数 && 1042 另一个简单的游戏

XidianOJ 1001 又是苹果

博客园排版简单介绍

逆序对

归并排序求逆序对