AT_arc054_d.[ARC054D] バブルソート

NOI/NOI+/CTSC

通过率:0%

AC君温馨提醒

该题目为【atcoder】题库的题目,您提交的代码将被提交至atcoder进行远程评测,并由ACGO抓取测评结果后进行展示。由于远程测评的测评机由其他平台提供,我们无法保证该服务的稳定性,若提交后无反应,请等待一段时间后再进行重试。

题目描述

高中生高桥每年在他的生日上都会收到一串数字序列。高桥喜欢计算冒泡排序所需的交换次数,以前几年,他总能轻松地计算出他收到的序列的交换次数。

但是,今年高桥的妈妈做了一些不同的事情。她给了他一个高度压缩的序列,即使是高桥,通常可以在几秒内计算出长度为 10710^7 的序列的冒泡排序交换次数,也觉得具有挑战性。

你的任务是找出对于这个长度为 $ 10^7 $ 的序列进行冒泡排序后,将交换次数模 $ 10^9+7 $ 后的结果。

冒泡排序是根据以下伪代码给出的算法。


input: a[1],...,a[N]
for i=1 to N-1
{
     for j=1 to N-i
     {
             if a[j]>a[j+1] swap(a[j],a[j+1])
     }
}

另外,从压缩列中恢复原始数列的方法如下:

  1. 指针指向压缩列的第一个项,堆栈为空。以下操作将重复进行,直到指针超出压缩列。最后,堆栈中剩下的一个数列就是所需的数列。

  2. 如果指针指向的值是正的,将一个只包含该值的数列推入堆栈,并将指针向前移动一步。

  3. 如果指针指向的值是 00 ,从堆栈中取出第一个和第二个数列,将它们连接在一起,然后将结果数列推入堆栈,并将指针向前移动一步。

  4. 如果指针指向的值是负的,从堆栈中取出顶部的数列,重复它 "指针指向的值" 次,然后将结果数列推入堆栈,并将指针向前移动一步。

例如,序列

1 2 3 0 -4 5 0 0 -2

表示序列

1 2 3 2 3 2 3 2 3 5 1 2 3 2 3 2 3 2 3 5

输入格式

数据将以以下标准格式输入

$ N $ $ A_1 $ ... $ A_N $

输出格式

计算其代表的数列的冒泡排序交换次数模109+710^9+7

输入输出样例

  • 输入#1

    9
    1 2 3 0 -4 5 0 0 -2

    输出#1

    45
  • 输入#2

    22
    12 35 -901 0 43 73 0 -18 2 6 0 -9 428 0 0 0 -23 8 0 -66 2 0

    输出#2

    509114582

说明/提示

  • $ N\ >\ 0 $
  • $ -105 ≦ A_i ≦ 105(1\ ≦\ i\ ≦\ N) $
  • $ A_i\ ≠\ 0 $ 的个数不会超过 10510^5 。
  • 保证有解。
  • 输入都是整数。

部分点

这个问题设置了部分分。

  • 如果在不超过 20002000 个非零元素的数据集上正确解决了压缩列的问题,您将获得部分分数,共计 5050 分。

输入解题思路,AI测评打分。不知道怎么写?

首页