题意:给出一个数列a,一个数的初始值为D,按数列顺序操作,每次把D变为$$min(D,abs(D-a[i]))$$。q个询问,每次询问任意修改a数列一个位置数后能否使操作a序列后D值不为0。

设$$b[i]$$表示最小的D初始值使经过i及以后的操作后值不为0。
则$$b[n+1]=1$$
如果$$\lfloor\frac{a[i]}{2}\rfloor\ge b[i+1]$$则$$b[i]=b[i+1]$$,因为$$a[i]$$操作无效
否则$$b[i]=b[i+1]+a[i]$$

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N=510000;
int n,q;
int a[N],d[N];
ll b[N];
int main()
{
    //freopen("tt.in","r",stdin);
    scanf("%d%d",&n,&d[0]);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    b[n+1]=1;
    for(int i=n;i>=1;i--)
    {
        if(a[i]/2>=b[i+1])b[i]=b[i+1];
        else b[i]=b[i+1]+a[i];
    }
    for(int i=1;i<=n;i++)
        d[i]=min(d[i-1],abs(d[i-1]-a[i]));
    scanf("%d",&q);
    for(int i=1,t;i<=q;i++)
    {
        scanf("%d",&t);
        puts(b[t+1]<=d[t-1] ? "YES" : "NO");
    }
    return 0;
}

标签: none

添加新评论