• [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
    ":"NO
    ");
        }
    }
    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

     
  • 相关阅读:
    Django创建模型。
    Kubernetes APIService资源
    应用系统管理风险
    [Golang] go list命令查看依赖的版本
    [Golang] 升级gin框架和jwtgo
    [Git] 解决git错误 OpenSSL SSL_read: Connection was reset, errno 10054
    [Github] 配置ssh免密码登录解决 You've successfully authenticated, but GitHub does not provide shell access.
    go循环遍历小坑
    Go 字符串拼接6种,最快的方式 strings.builder
    uniapp安卓真机调试提示检测不到手机【解决办法】
  • 原文地址:https://www.cnblogs.com/mastervan/p/11545608.html
Copyright © 2020-2023  润新知