time limit per test2 seconds

memory limit per test256 megabytes

inputstandard input

outputstandard output

Vasya commutes by train every day. There are n train stations in the city, and at the i-th station it’s possible to buy only tickets to stations from i + 1 to ai inclusive. No tickets are sold at the last station.

Let ρi, j be the minimum number of tickets one needs to buy in order to get from stations i to station j. As Vasya is fond of different useless statistic he asks you to compute the sum of all values ρi, j among all pairs 1 ≤ i < j ≤ n.

Input

The first line of the input contains a single integer n (2 ≤ n ≤ 100 000) — the number of stations.

The second line contains n - 1 integer ai (i + 1 ≤ ai ≤ n), the i-th of them means that at the i-th station one may buy tickets to each station from i + 1 to ai inclusive.

Output

Print the sum of ρi, j among all pairs of 1 ≤ i < j ≤ n.

Examples

input

4

4 4 4

output

6

input

5

2 3 5 5

output

17

Note

In the first sample it’s possible to get from any station to any other (with greater index) using only one ticket. The total number of pairs is 6, so the answer is also 6.

Consider the second sample:

ρ1, 2 = 1

ρ1, 3 = 2

ρ1, 4 = 3

ρ1, 5 = 3

ρ2, 3 = 1

ρ2, 4 = 2

ρ2, 5 = 2

ρ3, 4 = 1

ρ3, 5 = 1

ρ4, 5 = 1

Thus the answer equals 1 + 2 + 3 + 3 + 1 + 2 + 2 + 1 + 1 + 1 = 17.

【题解】



设dp[i]为i到i+1..n这些点的”总共”需要邮票的张数;

转移方程

dp[i] = dp[pos]+n-i-(a[i]-pos);

这里的pos,是(i+1..a[i])这个区间里面的a的值最大的下标;

表示的是从i开始往后转移的方式;

首先

从i->(i+1..a[i])都是只要一张票的。(这肯定是最优的)。所以不用从i到pos再转移到(pos+1..a[i]);

直接到pos+1..a[i]就可以了;

而a[i]之后的位置。则如果要到a[i]..a[pos]这段。则需要从i到pos再转移到。如下图。



上图中0->1、2、3、4、5、6这些都只要买一张票;

而dp[pos]包含了从pos->4、5的两张票;

如果再加上了dp[pos],则会重复;

因此要减去(a[i]-pos);

n-i+a[i]-pos

对应:

pos->a[i]后面的点;

然后从i连若干条边到pos;

因为有n-i+a[i]-pos个点。

所以总共要加n-i+a[i]-pos条边;

为什么选a最大的pos;

因为a[pos]是最大的。所以从pos可以走到更远的地方



如图,如果选择的是4。它最远能到8。则如果要到9就的再从8再买一张票到9;

而如果选择pos,则可以直接买一张票到9;这就节省了一张。

画图多理解下吧。

最后累加dp[1..n];

dp[n] = 0;

一开始dp[n-1]=1;

从n-2开始往前处理

获取某个区间内的最大值用ST算法就好(线段树is ok)

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
#include <vector>
#include <stack>
#define LL long long using namespace std; const int MAXN = 200000;
const int MAX = 17; int n, a[MAXN],rmq[MAXN][MAX+3],pre[MAX+3];
int need[MAXN];
LL dp[MAXN],ans = 0; void input(int &r)
{
r = 0;
char t = getchar();
while (!isdigit(t)) t = getchar();
int sign = 1;
if (t == '-')sign = -1;
while (!isdigit(t)) t = getchar();
while (isdigit(t)) r = r * 10 + t - '0', t = getchar();
r = r*sign;
} int main()
{
//freopen("F:\\rush.txt", "r", stdin);
scanf("%d", &n);
for (int i = 1; i <= n-1; i++)
scanf("%d", &a[i]),rmq[i][0] = i; pre[0] = 1;
for (int i = 1; i <= MAX; i++)
pre[i] = pre[i - 1] * 2; int now = 1;
need[1] = 0;
for (int i = 2; i <= n; i++)
if (i == pre[now])
need[i] = need[i - 1] + 1,now++;
else
need[i] = need[i - 1]; for (int l = 1;pre[l]<=n;l++)
for (int i = 1; i + pre[l]-1<= n; i++)
{
int left = rmq[i][l-1];
int right = rmq[i + pre[l - 1]][l-1];
if (a[left] > a[right])
rmq[i][l] = left;
else
rmq[i][l] = right;
} dp[n-1] = 1;
ans = 1;
for (int i = n - 2; i >= 1; i--)
{
int xy = need[a[i] - i+1];
int left = rmq[i][xy], right = rmq[a[i] - pre[xy] + 1][xy];
int pos;
if (a[left] > a[right])
pos = left;
else
pos = right;
dp[i] = dp[pos] + n - i - (a[i] - pos);
ans += dp[i];
} printf("%I64d\n", ans);
return 0;
}

【34.54%】【codeforces 675E】Trains and Statistic的更多相关文章

  1. codeforces 675E E. Trains and Statistic(线段树+dp)

    题目链接: E. Trains and Statistic time limit per test 2 seconds memory limit per test 256 megabytes inpu ...

  2. 【 BowWow and the Timetable CodeForces - 1204A 】【思维】

    题目链接 可以发现 十进制4 对应 二进制100 十进制16 对应 二进制10000 十进制64 对应 二进制1000000 可以发现每多两个零,4的次幂就增加1. 用string读入题目给定的二进制 ...

  3. 【34.57%】【codeforces 557D】Vitaly and Cycle

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  4. 【24.34%】【codeforces 560D】Equivalent Strings

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  5. 【34.88%】【codeforces 569C】Primes or Palindromes?

    time limit per test3 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  6. 【中途相遇法】【STL】BAPC2014 K Key to Knowledge (Codeforces GYM 100526)

    题目链接: http://codeforces.com/gym/100526 http://acm.hunnu.edu.cn/online/?action=problem&type=show& ...

  7. 【codeforces 793D】Presents in Bankopolis

    [题目链接]:http://codeforces.com/contest/793/problem/D [题意] 给你n个点, 这n个点 从左到右1..n依序排; 然后给你m条有向边; 然后让你从中选出 ...

  8. 【codeforces 799D】Field expansion

    [题目链接]:http://codeforces.com/contest/799/problem/D [题意] 给你长方形的两条边h,w; 你每次可以从n个数字中选出一个数字x; 然后把h或w乘上x; ...

  9. 【22.73%】【codeforces 606D】Lazy Student

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

随机推荐

  1. 微服务开源生态报告 No.4

    「微服务开源生态报告」,汇集各个开源项目近期的社区动态,帮助开发者们更高效的了解到各开源项目的最新进展. 社区动态包括,但不限于:版本发布.人员动态.项目动态和规划.培训和活动. 非常欢迎国内其他微服 ...

  2. PHP Laravel系列之环境搭建( VirtualBox+Vagrant+Homestead+系列网址)

    搭建环境从来都是阻挡一门新技能的最致命的硬伤,为了这个环境,我又是花费了半天的时间,各种问题层出不穷,下面基于网上的一些教程(我看到的都多少有些问题) 开始的时候是在实验楼这个平台上开始学习的,不过 ...

  3. POI解决内存溢出问题

    在POI3.8中SXSSF仅仅支持excel2007格式是对XSSF的一种流的扩展.目的在生成excel时候,需要生成大量的数据的时候,通过刷新的方式将excel内存信息刷新到硬盘的方式,提供写入数据 ...

  4. linux下安装composer以及使用composer安装laravel

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/nianzhi1202/article/details/72770099 一.安装composer之前 ...

  5. C# 显示实现接口

    显示实现接口的目的就是为了同名方法. 接口是多实现的,比如说一个方法要实现多个接口,然后这几个接口中有同名方法,这个时候就用到了接口的显示实现. 显示实现接口 成员方法的调用: 接口名.方法名  访问 ...

  6. Django之内置组件

    Django组件介绍       分页器的使用       Form       modelForm       orm       cookie和session       中间件       信号 ...

  7. IO NIO AIO及常用框架概述

    概述 nio 同步: 自己亲自出马持银行卡到银行取钱(使用同步IO时,Java自己处理IO读写). 异步: 委托一小弟拿银行卡到银行取钱,然后给你(使用异步IO时,Java将IO读写委托给OS处理,需 ...

  8. HDFS概念名称节点和数据节点-基本模型

  9. Python的unittest拓展和HTMLReport SKIP报表扩展

    C:\Python27\Lib中修改unittest内容 unittest 在init中添加Myskip代码: __all__ = ['TestResult', 'TestCase', 'TestSu ...

  10. iptables 负裁平衡(Load balancing)

    「负戴平衡」的作用是将连線平均分散给一组伺服器,以充分利用资源.最简单的作法是利用「通讯端口转接」技术,使其以循环顺序选择目的地位址. 设定iptables的组态 各家Linux系统的iptables ...