AT2401 [ARC072C] Alice in linear land 题解

ATCoder
Luogu

Description.

机器人从 \(0\) 出发向 \(D\) 走。
\(n\) 个指令形如 \(a_i\),让他向 \(D\)\(a_i\) 个单位。
机器人很贪心,如果走过去到 \(D\) 的距离更远它会拒绝执行这个指令。
每次你可以修改指令 \(i\),问能否让机器人到不了 \(D\)

Solution.

首先从前往后,我们可以 \(O(1)\) 知道当前的位置。
我们每次修改,只可能减少当前的值,所以我们需要求出最小的通过后面结束可以不为 \(0\) 的点。
考虑从后往前递推,设 \(i+1\) 的答案是 \(x\)
那如果 \(|x-a_i|<x\),即 \(\frac {a_i}2< x\le a_i\),那肯定有当前答案为 \(x+a_i\)
否则当前答案就是 \(x\)

Coding.

点击查看代码
//是啊……你就是那只鬼了……所以被你碰到以后,就轮到我变成鬼了{{{
#include<bits/stdc++.h>
using namespace std;typedef long long ll;
template<typename T>inline void read(T &x)
{
	x=0;char c=getchar(),f=0;
	for(;c<'0'||c>'9';c=getchar()) if(c=='-') f=1;
	for(;c>='0'&&c<='9';c=getchar()) x=(x<<1)+(x<<3)+(c^48);
	if(f) x=-x;
}
template<typename T,typename...L>inline void read(T &x,L&...l) {read(x),read(l...);}//}}}
const int N=500005;int n,D,m,d[N],w[N],z[N];
int main()
{
	read(n,D),w[0]=D,z[n+1]=1;for(int i=1;i<=n;i++) read(d[i]);
	for(int i=1;i<=n;i++) w[i]=min(w[i-1],abs(w[i-1]-d[i]));
	for(int i=n;i>=1;i--) z[i]=(z[i+1]<=d[i]/2?z[i+1]:z[i+1]+d[i]);
	read(m);for(int i=1,x;i<=m;i++) read(x),puts(w[x-1]>=z[x+1]?"YES":"NO");
	return 0;
}
posted @ 2021-10-26 15:35  Peal_Frog  阅读(23)  评论(0编辑  收藏  举报