zoukankan      html  css  js  c++  java
  • 【题解】考分鄙视

    题目描述

             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;
    }
    参考程序
  • 相关阅读:
    python super()函数
    java中的方法
    python的5大数据类型操作之列表篇
    java流程控制
    eval函数 exec函数 compile函数之间的应用
    基础语法
    java中对字符串的操作
    iOS 简单的文件写入
    iOS弹出窗口
    iOS block传值和属性传值
  • 原文地址:https://www.cnblogs.com/kcn999/p/11217359.html
Copyright © 2011-2022 走看看