1. 程式人生 > >AtCoder Regular Contest 072 E:Alice in linear land

AtCoder Regular Contest 072 E:Alice in linear land

正整數 mes 每次 line and linear 個數 har 空間復雜度

題目傳送門:https://arc072.contest.atcoder.jp/tasks/arc072_c

題目翻譯

給你一個數組\(D\),然後給你一個操作序列\(d\),每次操作可以將\(D\)變成\(min(D,|D-d[i]|)\)。假如這一個操作序列執行完了之後你的\(D\)變成\(0\)了,那麽就稱這個操作序列是合法的。現在有\(Q\)個詢問,每個詢問由一個\(q[i]\)表示,問你假如你可以把\(d[i]\)變成任意正整數,你能否將這個操作序列變成不合法的。\(N,Q\leqslant 5*10^5\)

題解

對於單次詢問\(id\),前\(id\)步走完之後的位置\(pos\)是確定的。所以我們只需要判斷,是否存在一個位置\(x\)

,使得\(pos\geqslant x \geqslant 1\)並且從\(x\)開始執行\(id\)\(n\)號操作走不到\(0\)

我們設\(f[i]\)表示最小的位置\(x\)在執行了\(i\)\(n\)號操作之後不能走到\(0\),初始值顯然\(f[n+1]=1\)

假設\(d[i]\geqslant f[i+1]*2\)那麽走這一步顯然不會改變,那麽\(f[i]=f[i+1]\),否則\(f[i]=f[i+1]+d[i]\)

然後對於每個詢問,你直接判斷\(pos[id-1]\)是否大於等於\(f[id+1]\)就行了,如果滿足那麽你就可以使\(d[i]=f[id+1]-pos[id-1]\)

並且之後的操作都執行完也不會到\(0\)

時間復雜度:\(O(n+m)\)

空間復雜度:\(O(n)\)

代碼如下:

#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long ll;

const int maxn=5e5+5;

int n,m;
ll f[maxn];
int pos[maxn],d[maxn];

int read() {
    int x=0,f=1;char ch=getchar();
    for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
    for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
    return x*f;
}

int main() {
    n=read(),pos[0]=read();
    for(int i=1;i<=n;i++) {
        d[i]=read();
        pos[i]=min(pos[i-1],abs(pos[i-1]-d[i]));
    }
    f[n+1]=1;
    for(int i=n;i;i--) {
        f[i]=f[i+1];
        if(d[i]<f[i]*2)f[i]+=d[i];
    }
    m=read();
    for(int i=1;i<=m;i++) {
        int id=read();
        if(pos[id-1]>=f[id+1])puts("YES");
        else puts("NO");
    }
    return 0;
}

AtCoder Regular Contest 072 E:Alice in linear land