“直线世界”的新年正在到来!在这个世界中,有 n 个单元格,被编号为从 1 到 n 的整数,成为一个 1 × n 的棋盘。人们生活在单元格中。然而,难以在不同单元格之间移动,因为逃离单元格具有难度。人们想与生活在其它单元格中的其他人相遇。
因此,用户 tncks0121 制作了一套在这些单元格之间移动的运输系统,来庆祝新年。首先,他考虑了 n - 1 个正整数 a1, a2, ..., an - 1 。对于每个整数 i (其中 1 ≤ i ≤ n - 1),满足条件 1 ≤ ai ≤ n - i 。其次,他制作了 n - 1 个传送门,使用从 1 到 n - 1 的整数编号。第 i (1 ≤ i ≤ n - 1) 个传送门连接了单元格 i 和单元格 (i + ai),并且一个人可以使用第 i 个传送门,从单元格 i 出发,旅行到单元格 (i + ai) 。不幸的是,一个人不能反向使用传送门,这意味着不能使用第 i 个传送门,从单元格 (i + ai) 移向单元格 i 。这是显而易见的,因为存在条件 1 ≤ ai ≤ n - i ,一个人不允许使用传送门离开“直线世界”。
当前,我站在单元格 1 处,并且我想前往单元格 t 。然而,我不知道是否可能抵达那里。请判断,通过使用已建造的运输系统,我是否能够前往单元格 t 。
第一行包含了两个以空格分隔的整数 n (3 ≤ n ≤ 3 × 104) 和 t (2 ≤ t ≤ n) — 表示单元格的数目,以及我想要前往的目标单元格的索引。
第二行包含 n - 1 个以空格分隔的整数 a1, a2, ..., an - 1 (1 ≤ ai ≤ n - i)。数据保证:使用给定的运输系统,一个人无法离开“直线世界”。
如果我能够使用此运输系统前往单元格 t ,则打印 "YES"。否则,打印 "NO"。
8 4 1 2 1 2 1 2 1
YES
8 5 1 2 1 2 1 1 1
NO
在第一个示例中,已访问的单元格是:1, 2, 4;因此,我们能够成功访问单元格 4。
在第二个示例中,可能访问的单元格是:1, 2, 4, 6, 7, 8;因此,我们无法访问想要前往的单元格 5。
#include<stdio.h>
int a[30010];
int main()
{
int n,t,i;
while(scanf("%d %d",&n,&t)!=EOF)
{
for (i=1;i<=n-1;i++)
scanf("%d",&a[i]);
for (i=1;i<=n-1;)
{
if (t==i+a[i])
{
printf("YES\n");
break;
}
else if (t<i+a[i])
{
printf("NO\n");
break;
}
else
i = i + a[i];
}
}
return 0;
}