【CF407B】ロングパス

有个人进入一个迷宫,这个迷宫共有n+1个房间,编号从1~n+1
ta现在在第1个房间,需要到达第n+1个房间以出去。房间i有两个前进的门(来时的门不算)
第一扇门通向第i+1个房间,第二扇门通向第pi(1<=pi<=i)房间
为了不迷路,这个人每到达一个房间,就会给这个房间画一个标记
画完后如果这个房间的标记数为偶数个,ta就会选择这个房间第一扇门前进,否则选择第二扇门前进
 求这个人需要通过多少道门到达终点(即第n+1个房间),答案对1000000007取模

非常に単純な再帰的な
デザイン\(ANS [I] \)ノードiを初めて

明らかに、ポイントが再帰関係で、正面から直接来た場合:
\ [ANS [I] + = ANS [-I 1]さんが+1 \。]

我々はこの点に到達する最初の時間のための時間を設定するので、それはから計算されなければならない\(I-1 \)に大きな円バック周り号ノード\(I-1 \) 時間数点
\ [ ANS [I] + = ANS [ I-1] + 1-ANS [FA [I-1]] \]

この関係は、よく理解されているからである(I-1 \)\への周りの大きな円\(FA [I-1] \) この時点までバック
が、制限のタイトルがあります:\(1 \のLeq FAは、 [I] \のLeq I \) 以前に関連するアイテムの一部のみのそれぞれ
我々は\ \(\シータ(N) )再度再帰

コード:

#include<bits/stdc++.h>
#define mod 1000000007
#define N 1000005
using namespace std;

int n,a[N];
long long ans[N];

template<class T>inline void read(T &res)
{
    char c;T flag=1;
    while((c=getchar())<'0'||c>'9')if(c=='-')flag=-1;res=c-'0';
    while((c=getchar())>='0'&&c<='9')res=res*10+c-'0';res*=flag;
}

int main()
{
    read(n);
    for(register int i=1;i<=n;++i) read(a[i]);
    for(register int i=2;i<=n+1;++i)
        ans[i]=((ans[i-1]+1)+(ans[i-1]+1)-ans[a[i-1]])%mod;
    printf("%lld\n",(ans[n+1]+mod)%mod);
    return 0;
}

おすすめ

転載: www.cnblogs.com/tqr06/p/11811578.html