码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces 283B Cow Program

时间:2015-03-12 20:45:45      阅读:183      评论:0      收藏:0      [点我收藏+]

标签:

题意:给你a[2] - a[n], 一个初始x = 1,初始y = 0  ,执行下面步骤

1) x +=a[x] ,y += a[x]

2) x -= a[x] ,y += a[x]

3)重复1-2步骤。只要中间x <=0 || x > n  就跳出。输出y的值

问你a[1] 从 [1,n-1]分别的值为多少。

解题思路:dfs 求 dp[i][0/1]  求以加法进入 i 和以减法进入 i 能得到的值。

解题代码:

技术分享
  1 // File Name: 283b.cpp
  2 // Author: darkdream
  3 // Created Time: 2015年03月12日 星期四 10时59分22秒
  4 
  5 #include<vector>
  6 #include<list>
  7 #include<map>
  8 #include<set>
  9 #include<deque>
 10 #include<stack>
 11 #include<bitset>
 12 #include<algorithm>
 13 #include<functional>
 14 #include<numeric>
 15 #include<utility>
 16 #include<sstream>
 17 #include<iostream>
 18 #include<iomanip>
 19 #include<cstdio>
 20 #include<cmath>
 21 #include<cstdlib>
 22 #include<cstring>
 23 #include<ctime>
 24 #define LL long long
 25 
 26 using namespace std;
 27 int a[200005];
 28 int vis[200005][2];
 29 LL dp[200005][2];
 30 int n ;
 31 void dfs(int k ,int t,int color)
 32 {
 33      if(t == 1)
 34      {
 35         dp[k][t] = a[k];
 36         if(k +a[k] > n)
 37         {
 38            return ;
 39         }
 40         if(vis[k + a[k]][t^1] != 0  )
 41         {
 42             if(vis[k+a[k]][t^1] == color)
 43                 dp[k][t] = -1;
 44             else{
 45                 if(dp[k+a[k]][t^1] == -1)
 46                     dp[k][t] = -1;
 47                 else dp[k][t] += dp[k+a[k]][t^1];
 48             }
 49             return ;
 50         }
 51         vis[k+a[k]][t^1] = color; 
 52         dfs(k+a[k],0,color);
 53         if(dp[k+a[k]][t^1] == -1)
 54             dp[k][t] = -1;
 55         else dp[k][t] += dp[k+a[k]][t^1];
 56      }else if(t == 0 ){
 57           dp[k][t] = a[k];
 58         if(k - a[k] <= 0)
 59         {
 60            return ;
 61         }
 62         if(k - a[k] ==  1)
 63         {
 64            dp[k][t] = -1;
 65            return ;
 66         }
 67         if(vis[k - a[k]][t^1] != 0  )
 68         {
 69             if(vis[k-a[k]][t^1] == color)
 70                 dp[k][t] = -1;
 71             else{
 72                 if(dp[k-a[k]][t^1] == -1)
 73                     dp[k][t] = -1;
 74                 else dp[k][t] += dp[k-a[k]][t^1];
 75             }
 76             return ;
 77         
 78         }
 79         vis[k-a[k]][t^1] = color; 
 80         dfs(k-a[k],1,color);
 81         if(dp[k-a[k]][t^1] == -1)
 82             dp[k][t] = -1;
 83         else dp[k][t] += dp[k-a[k]][t^1];
 84      }
 85 }
 86 int main(){
 87     scanf("%d",&n);
 88     for(int i = 2 ; i <= n;i ++)
 89     {
 90            scanf("%d",&a[i]);       
 91     }
 92     for(int i = 2;i <= n;i ++)
 93     {
 94          if(vis[i][0] == 0)
 95          {
 96             vis[i][0] = i; 
 97             dfs(i,0,i);
 98          }
 99          if(vis[i][1] == 0 )
100          {
101             vis[i][1] = i; 
102             dfs(i,1,i);
103          }
104     }
105     for(int i = 1;i < n;i ++)
106     {
107         if(1 + i > n)
108         {
109             printf("%d\n",i);
110             continue;
111         }else{
112             if(dp[1+i][0] != -1)
113             printf("%I64d\n",i+dp[1+i][0]);    
114             else printf("-1\n");
115         }
116     }
117     
118 return 0;
119 }
View Code

 

Codeforces 283B Cow Program

标签:

原文地址:http://www.cnblogs.com/zyue/p/4333329.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!