[DP]ARC072E Alice in linear land

Description

爱丽丝·玛格特洛伊德居住在幻想乡里的一条直线上。今天,她打算驾驶一台神秘仪器,去往直线上的某些地方。一开始,她与目的地的距离是D。当她往神秘仪器中输入一个数x时,它会朝着目的地方向前进x的距离。这台神秘仪器有一个特性,如果它意识到朝着目的地行驶x的距离会导致爱丽丝离目的地的距离更远(即跨过了目的地,并行驶了更长的一段距离),它会选择拒绝指令,保持原地不动。举个例子,当爱丽丝与目的地的距离是3时,如果她给仪器下达2的指令,距离会变成1;如果下达5的指令,距离会变成2(跨过了目的地后又前进了2);如果下达了8的指令,则会原地不动,距离依然是3。

爱丽丝做了一个旅行计划,计划包含N个整数d1,d2,...,dN,表示爱丽丝依次给机器下达的指令。然而,幻想乡中居住着另一名邪恶的黑白色的魔法使(?),她打算偷偷修改爱丽丝的旅行计划,使得爱丽丝无法到达目的地。邪恶魔法使有Q个计划,每次计划对应一个qi,表示她要改变爱丽丝计划中的第qi个数。注意这Q个计划之间是两两无关的,每次修改都是直接改变原序列。

为了拯救幻想乡的和(核)平日常,请你判断魔法使的每个计划能否得逞。

Input

输入第一行包含两个整数ND
输入第二行包含N个整数d1,d2,...,dN
输入第三行包含一个整数Q
输入第四行包含Q个整数q1,q2,...,qQ

Output

输出包含Q行,如果第i个计划能取得成功,第i行输出字符串"YES",否则输出"NO"。

Sample Input

## Sample Input 1

    4 10

    3 4 3 3

    2

    4 3

 

## Sample Input 2

    5 9

    4 4 2 3 2

    5

    1 4 2 3 5

 

## Sample Input 3

    6 15

    4 3 5 4 2 1

    6

    1 2 3 4 5 6

Sample Output

## Sample Output 1

    NO

    YES

    

## Sample Output 2

    YES

    YES

    YES

    YES

    YES

    

## Sample Output 3

    NO

    NO

    YES

    NO

    NO

    YES

HINT

1≤N,Q≤5×1e5
1≤D,di≤1e9
1≤qi≤N

有40分的子任务满足1≤N≤100,1≤D,di≤10000

分析

首先执行完第i个命令的距离值递推式为$dist[i]=min(dist[i-1],|dist[i-1]-d[i]|)$

不难想到,当第i个命令能够使她无法到达时,那么i+1至n中,能够到达的距离值从1开始的连续区间的右端点值一定小于dist[i-1]

那么这个值怎么递推呢?

设其为f,有$f[i]=d[i]<=2*f[i+1]+1?f[i+1]+d[i]:f[i+1]$

最后直接判断即可

 

#include <iostream>
#include <cstdio>
using namespace std;
typedef long long ll;
const int N=5e5+10;
int n,q;
ll d[N],m[N],p[N];

ll Abs(ll a) {return a<0?-a:a;}

int main() {
    freopen("A.in","r",stdin);
    freopen("A.out","w",stdout);
    scanf("%d%lld",&n,&d[0]);m[0]=d[0];
    for (int i=1;i<=n;i++) scanf("%lld",&d[i]),m[i]=min(m[i-1],Abs(m[i-1]-d[i]));
    for (int i=n;i;i--) {
        p[i]=p[i+1];
        if (d[i]<=(p[i]<<1)+1) p[i]+=d[i];
    }
    for (scanf("%d",&q);q;q--) {
        int i;
        scanf("%d",&i);
        printf(m[i-1]>p[i+1]?"YES\n":"NO\n");
    }
}
View Code

 

Description

爱丽丝·玛格特洛伊德居住在幻想乡里的一条直线上。今天,她打算驾驶一台神秘仪器,去往直线上的某些地方。一开始,她与目的地的距离是 DD。当她往神秘仪器中输入一个数 xx时,它会朝着目的地方向前进 xx的距离。这台神秘仪器有一个特性,如果它意识到朝着目的地行驶 xx的距离会导致爱丽丝离目的地的距离更远(即跨过了目的地,并行驶了更长的一段距离),它会选择拒绝指令,保持原地不动。举个例子,当爱丽丝与目的地的距离是3时,如果她给仪器下达2的指令,距离会变成1;如果下达5的指令,距离会变成2(跨过了目的地后又前进了2);如果下达了8的指令,则会原地不动,距离依然是3。

爱丽丝做了一个旅行计划,计划包含 NN个整数 d1,d2,...,dNd1,d2,...,dN,表示爱丽丝依次给机器下达的指令。然而,幻想乡中居住着另一名邪恶的黑白色的魔法使(?),她打算偷偷修改爱丽丝的旅行计划,使得爱丽丝无法到达目的地。邪恶魔法使有 QQ个计划,每次计划对应一个 qiqi,表示她要改变爱丽丝计划中的第 qiqi个数。 注意这QQ个计划之间是两两无关的,每次修改都是直接改变原序列。

为了拯救幻想乡的和(核)平日常,请你判断魔法使的每个计划能否得逞。

Input

输入第一行包含两个整数 NNDD
输入第二行包含 NN个整数 d1,d2,...,dNd1,d2,...,dN
输入第三行包含一个整数 QQ
输入第四行包含 QQ个整数 q1,q2,...,qQq1,q2,...,qQ

Output

输出包含 QQ行,如果第 ii个计划能取得成功,第 ii行输出字符串"YES",否则输出"NO"。

Sample Input

## Sample Input 1
    4 10
    3 4 3 3
    2
    4 3

## Sample Input 2
    5 9
    4 4 2 3 2
    5
    1 4 2 3 5

## Sample Input 3
    6 15
    4 3 5 4 2 1
    6
    1 2 3 4 5 6

Sample Output

## Sample Output 1
    NO
    YES
    
## Sample Output 2
    YES
    YES
    YES
    YES
    YES
    
## Sample Output 3
    NO
    NO
    YES
    NO
    NO
    YES

HINT

1N,Q5×1051≤N,Q≤5×105
1D,di1091≤D,di≤109
1qiN1≤qi≤N

有40分的子任务满足1N100,1D,di100001≤N≤100,1≤D,di≤10000

 

 

转载于:https://www.cnblogs.com/mastervan/p/11545608.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值