Riverside Curio

time limit per test1 second

memory limit per test256 megabytes

Arkady decides to observe a river for n consecutive days. The river's water level on each day is equal to some real value.

Arkady goes to the riverside each day and makes a mark on the side of the channel at the height of the water level, but if it coincides with a mark made before, no new mark is created. The water does not wash the marks away. Arkady writes down the number of marks strictly above the water level each day, on the i-th day this value is equal to mi.

Define di as the number of marks strictly under the water level on the i-th day. You are to find out the minimum possible sum of di over all days. There are no marks on the channel before the first day.

Input

The first line contains a single positive integer n (1 ≤ n ≤ 105) — the number of days.

The second line contains n space-separated integers m1, m2, ..., mn (0 ≤ mi < i) — the number of marks strictly above the water on each day.

Output

Output one single integer — the minimum possible sum of the number of marks strictly below the water level among all days.

Examples

input

6

0 1 0 3 0 2

output

6

input

5

0 1 2 1 2

output

1

input

5

0 1 1 2 2

output

0

Note

In the first example, the following figure shows an optimal case.

Note that on day 3, a new mark should be created because if not, there cannot be 3 marks above water on day 4. The total number of marks underwater is 0 + 0 + 2 + 0 + 3 + 1 = 6.

In the second example, the following figure shows an optimal case.

这道题很妙啊~~~

我们可以假设\(t[i]\)表示第\(i\)天所有的水位线条数,显然\(t[i] = d[i] + 1 + m[i]\)

由于题目要求的是\(min(\sum d[i])\),我们就可以转化为求\(min(\sum t[i])\)

接下来我们来看看\(t\)这个数列应该满足什么条件:

\(t_i ≥ max(t_{i-1}, m_i + 1)\)

\(t_i ≥ t_{i+1}-1\)

由第二个条件可以推出\(t_i ≥ t_j-(j-i)\ \ (j>i)\)

那么我们来想一件事,是不是有一个合法的数列\(t\),就一定有一种对应的合法方案吗?

条件一看出,任意两个相邻的数的差小于等于1.(当然,后面的大于等于前面的)

显然,如果\(t[i]\)是递增的,那么没有任何问题。

如果有两个相邻的数相等时,说明新画的水位线和以前的一条重合了。

那么我们来思考一个问题,什么时候会产生矛盾。

当你发现你后面需要\(x\)根水位线,但是你当前的方案一共都没有这么多条的时候就矛盾了。

那么会不会出现这种情况呢?

这种情况是\(m[i] > t[i-1]\)的时候,由于\(t_i ≥ max(t_{i-1}, m_i + 1)\),所以\(t_i ≥ m_i+1\)

又因为相邻两个数的差不超过1,所以\(t_i ≥ t_{i-1}\),所以这种情况不存在。

简单的证明完毕。

接下来考虑代码实现问题:

我们要构造这个数列,也就是要满足上述条件。

那么我们可以这样构造

先让所有的数都等于\(m_i + 1\),然后遍历一遍

发现\(t_{i-1}>t_i, t_i = t_{i-1}\)

这样就满足条件一了。

紧接着去满足条件二,我们可以倒着遍历一遍,如果发现不满足条件的,就强行变成满足条件的最优解。

#include<bits/stdc++.h>
long long m[200000],t[200000],ans,n;
int main()
{
scanf("%I64d",&n);
for (int i=1;i<=n;++i) scanf("%I64d",&m[i]),t[i]=m[i]+1;
for (int i=2;i<=n;++i) if (t[i]<t[i-1]) t[i]=t[i-1];
for (int i=n;i>=2;--i) if (t[i-1]<t[i]-1) t[i-1]=t[i]-1;
for (int i=1;i<=n;++i) ans+=t[i]-1-m[i];
printf("%I64d",ans);
return 0;
}

Riverside Curio的更多相关文章

  1. 【推导】【贪心】Codeforces Round #472 (rated, Div. 2, based on VK Cup 2018 Round 2) D. Riverside Curio

    题意:海平面每天高度会变化,一个人会在每天海平面的位置刻下一道痕迹(如果当前位置没有已经刻划过的痕迹),并且记录下当天比海平面高的痕迹有多少条,记为a[i].让你最小化每天比海平面低的痕迹条数之和. ...

  2. [Codeforces947D]Riverside Curio(思维)

    Description 题目链接 Solution 设S[i]表示到第i天总共S[i]几个标记, 那么满足S[i]=m[i]+d[i]+1 m[i]表示水位上的标记数,d[i]表示水位下的标记数 那么 ...

  3. codeforces round 472(DIV2)D Riverside Curio题解(思维题)

    题目传送门:http://codeforces.com/contest/957/problem/D 题意大致是这样的:有一个水池,每天都有一个水位(一个整数).每天都会在这一天的水位上划线(如果这个水 ...

  4. 【Codeforces 924C】Riverside Curio

    [链接] 我是链接,点我呀:) [题意] 题意 [题解] 设第i天总共的线数为t[i] 水平线上线数为m[i]是固定的 水平线下的线数设为d[i] 则d[i]+m[i]+1=t[i] 也就是说问题可以 ...

  5. CF957D Riverside Curio

    dp+预处理 dp[i]表示第i天时的水位线有多少条, 然后你会发现这个dp是有后效性的,当第i天的m[i]>dp[i-1]时就要修改之前的dp值 因此我们预处理出每一天的至少要多少条水位线,记 ...

  6. {ICIP2014}{收录论文列表}

    This article come from HEREARS-L1: Learning Tuesday 10:30–12:30; Oral Session; Room: Leonard de Vinc ...

  7. Python标准模块--asyncio

    1 模块简介 asyncio模块作为一个临时的库,在Python 3.4版本中加入.这意味着,asyncio模块可能做不到向后兼容甚至在后续的Python版本中被删除.根据Python官方文档,asy ...

  8. 读书笔记--SQL必知必会09--汇总数据

    9.1 聚集函数 聚集函数(aggregate function),对某些行运行的函数,计算并返回一个值. 使用聚集函数可以汇总数据而不必将涉及的数据实际检索出来. 可利用标准的算术操作符,实现更高级 ...

  9. 读书笔记--SQL必知必会11--使用子查询

    11.1 子查询 查询(query),任何SQL语句都是查询.但此术语一般指SELECT语句. SQL还允许创建子查询(subquery),即嵌套在其他查询中的查询. 作为子查询的SELECT语句只能 ...

随机推荐

  1. 2018-10-11-WPF-拖动滚动

    title author date CreateTime categories WPF 拖动滚动 lindexi 2018-10-11 14:10:41 +0800 2018-2-13 17:23:3 ...

  2. 基于GPU的图像处理平台

    基于GPU的图像处理平台 1.  (309)英伟达推Jetson TX1 GPU模块力推人工智能 1.1 产品概述 Jetson TX1 GPU模块,主要针对近年来蓬勃发展的人工智能市场,包括无人机. ...

  3. 265-Keystone II JESD204B 66AK2L06 评估模块 (现行) XEVMK2LX

    Keystone II JESD204B 66AK2L06 评估模块 (现行) XEVMK2LX 一. 板卡概述The XEVMK 2LX is a full-featured evaluation ...

  4. 微信小程序(8)--头部导航滑动

    项目需求:实现头部导航,可左右滑动. <view class="top-news"> <view class="self-box"> & ...

  5. 第二节:专做自己是小白——重新认识MySQL 学习记录

    一.安装MySQL的一些知识点 1.进程号是操作系统随机分配,每次启动程序都会有一个新的进程号.    2.mysql服务器进程默认名称MySQL,MySQL客户端进程默认名称mysql.    3. ...

  6. ltp-ddt realtime_cpuload_10p 涉及的cpuloadgen交叉编译及安装

    1.下载源码 https://github.com/ptitiano/cpuloadgen/archive/v0.94.tar.gz 解压 tar -zxvf cpuloadgen-0.94.tar. ...

  7. torchvision.transforms模块介绍

    torchvision.transforms模块 官网地址:https://pytorch.org/docs/stable/torchvision/transforms.html# torchvisi ...

  8. BZOJ3622 已经没有什么好害怕的了 二项式反演+DP

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=3622 题解 首先显然如果 \(n - k\) 为奇数那么就是无解.否则的话,"糖果& ...

  9. ARC093F Dark Horse 容斥原理+DP

    题目传送门 https://atcoder.jp/contests/arc093/tasks/arc093_d 题解 由于不论 \(1\) 在哪个位置,一轮轮下来,基本上过程都是相似的,所以不妨假设 ...

  10. 【学习笔记】可持久化并查集(BZOJ3673)

    好久之前就想学了 然后今天恰巧一道题需要用到就学了 前置芝士 1.主席树[可持久化数组] 2.并查集 如果你掌握了前面两个那么这个东西你就会觉得非常沙茶.. 构造 可持久化并查集 = 主席树  + 并 ...