【AtCoder Regular Contest 072 E】Alice in linear land

动态规划。

题目大意:

有一个数轴,终点为 D。给定 d1,d2,d3,,dn。一个机器人从原点出发,第 i 次行动会向终点方向di 个单位,如果停下的位置离终点反而更远则不行动。

m 个询问,每次给出 k,你可以将 dk 改成任意整数。问是否存在一种方案,使得机器人依次执行完所有指令以后还不能到终点。

题解:

每次给出 k,在到达 k 之前的情况是不会变的。

fi,j 表示第 i 次执行前在位置 j,最后是否能到终点。

我们只需要知道在第 k 次行动是否能走到一个不能到达终点的方案即可。

事实上我们只需要关心最小的不能到达终点的点。

我们记录 gi 表示第 i 次行动,0gi 位置都能到达终点。

然后往前推。如果 2gi+1+1di,则 gi 必须要往外 di 格,否则可以不动。

之后询问时直接比较大小即可。

Code:

  1. #include<cstdio>
  2. #include<cstdlib>
  3. int F[500005],A[500005];
  4. int n,i;
  5. int main(){
  6. scanf("%d%d",&n,A);
  7. for(i=1;i<=n;++i)scanf("%d",A+i);
  8. F[n]=A[n]==1;
  9. for(i=n-1;i;--i)F[i]=F[i+1]*2+1>=A[i]?F[i+1]+A[i]:F[i+1];
  10. for(i=1;i<=n;++i)A[i]=abs(A[i-1]-A[i])<A[i-1]?abs(A[i-1]-A[i]):A[i-1];
  11. scanf("%d",&n);
  12. while(n--)scanf("%d",&i),puts(A[i-1]>F[i+1]?"YES":"NO");
  13. return 0;
  14. }

Gitalking ...