• 【题解】考分鄙视


    题目描述

             Whence这个学期考了n次试,每一次都有一个0-20000之间的整数分数。Whence本来的状态应该是每一次考试都比前一次多一分(除第一次),但由于他很不稳定,偏差可能很大。对于第i次考试,如果有第j次考试满足1≤j<i≤n,且以第j次考试分数作为基准估计的第i次考试成绩比实际成绩低,就说第i次考试鄙视了第j次考试(估计分可以超过20000)。为了提高自信,Whence想知道他这个学期所有考试总共有多少次鄙视。

    输入格式

             第一行,一个整数n(1<n≤100000);

             第二行为n次考试成绩。

    输出格式

             一行,这个学期所有考试的总共鄙视次数(总数可能很大,只需要输出总数mod12345的值)。

    输入样例

    4

    1 3 3 5

    输出样例

    3

    题解

             如果直接按照原数组求逆序貌似是有问题的。关键是我们是要比较估计值。

             其实我们可以将每一个$a[i]$更改为其第$n$次考试的估计值,也就是让$a[i]$再加上$n - i$,再对新数组进行归并排序求逆序对即可。

    #include <iostream>
    #include <cstdio>
    
    #define MAX_N 100000
    
    using namespace std;
    
    int n;
    int a[MAX_N | 1];
    long long ans;
    
    void Merge_Sort(int lt, int rt)
    {
        if(lt == rt) return;
        int mid = lt + rt >> 1;
        Merge_Sort(lt, mid);
        Merge_Sort(mid + 1, rt);
        int i = lt, j = mid + 1;
        int b[MAX_N | 1], cnt = 0;
        while(i <= mid && j <= rt)
        {
            if(a[i] >= a[j]) b[++cnt] = a[i++];
            else ans += mid - i + 1, b[++cnt] = a[j++];
        }
        while(i <= mid) b[++cnt] = a[i++];
        while(j <= rt) b[++cnt] = a[j++];
        for(register int i = lt; i <= rt; ++i)
        {
            a[i] = b[i - lt + 1];
        }
        return;
    }
    
    int main()
    {
        scanf("%d", &n);
        for(register int i = 1; i <= n; ++i)
        {
            scanf("%d", &a[i]);
            a[i] += n - i; // 重点语句
        }
        Merge_Sort(1, n);
        printf("%lld", ans % 12345);
        return 0;
    }
    参考程序
  • 相关阅读:
    WMware 10 Ubuntu 12.04 进入Unity模式
    Spring+Struts集成(第二种方案)
    strut1.X和spring整合的二种方法
    Struts+Spring+Hibernate的Web应用执行过程
    Hibernate配置文件中配置各种数据库的driver、URL
    连接Oracle数据库的Hibernate配置文件
    Hibernate SQL 方言(hibernate.dialect)
    HibernateUtil.java
    hibernate里的generator中class =value介绍
    Hibernate的generator属性
  • 原文地址:https://www.cnblogs.com/kcn999/p/11217359.html
Copyright © 2020-2023  润新知