AT_arc072_c [ARC072E] Alice in linear land 题解
题意 有一个数轴,终点为原点。一个机器人位于 D,有 n 条指令,对第 i 条指令机器人会向终点移动 di 距离,若移动后距离变大则不移动,意思是可能冲过,但是若距离变小就可以过去。 给出 m 个询问…
题意
有一个数轴,终点为原点。一个机器人位于 ,有 条指令,对第 条指令机器人会向终点移动 距离,若移动后距离变大则不移动,意思是可能冲过,但是若距离变小就可以过去。
给出 个询问,第 次询问允许将 修改为任意整数(仅当前询问生效)。问是否存在修改方案使机器人不能走到终点。
题解
记 表示不修改前 个操作情况下,当前能走动哪。那么对于一次可以修改 的询问,若存在一个 使得 在经过 到 的操作后没到 则有解,否则无解。所以考虑求出最小使得走完后面操作不为 的距离,记 表示最小走完 到 的操作之后不为 的距离,倒着 dp 即可:
- 当 ,有 。因为这种情况肯定会直接冲过,但是冲过 故不会这样走,这样 取到了下限。
- 当 ,有 。分类讨论一下,若这一步是冲过的,那么 所以不可能;若没动,那么 这时候若直接冲过 不可能,或者直接走过去 所以也不可能;所以只能是直接走过去的情况。
#include<bits/stdc++.h>
// #define ONLINE_JUDGE
#define INPUT_DATA_TYPE int
#define OUTPUT_DATA_TYPE int
inline __attribute((always_inline)) INPUT_DATA_TYPE read(){register INPUT_DATA_TYPE x=0;register char f=0,c=getchar();while(c<'0'||'9'<c)f=(c=='-'),c=getchar();while('0'<=c&&c<='9')x=(x<<3)+(x<<1)+(c&15),c=getchar();return f?-x:x;}void print(OUTPUT_DATA_TYPE x){if(x<0)x=-x,putchar('-');if(x>9)print(x/10);putchar(x%10^48);return;}
int mnD[500010],dis[500010],d[500010];
int abss(int x){return x<0?-x:x;}
int main(){
#ifndef ONLINE_JUDGE
freopen("name.in", "r", stdin);
freopen("name.out", "w", stdout);
#endif
register int i;
int n=read();
dis[0]=read();
for(i=1;i<=n;++i){
d[i]=read();
dis[i]=std::min(abss(dis[i-1]-d[i]),dis[i-1]);
}
mnD[n+1]=1;
for(i=n;i;--i){
if(d[i]/2>=mnD[i+1]) mnD[i]=mnD[i+1];
else mnD[i]=mnD[i+1]+d[i];
}
int q=read();
while(q--){
i=read();
puts(dis[i-1]>=mnD[i+1]?"YES":"NO");
}
#ifndef ONLINE_JUDGE
fclose(stdin);
fclose(stdout);
#endif
return 0;
}谢谢你,读到这里。
本文同步自洛谷专栏,保留原始正文与发布时间。在洛谷查看原文 ↗