AtCoder Regular Contest 072 E:Alice in linear land
阿新 • • 發佈:2018-12-17
正整數 mes 每次 line and linear 個數 har 空間復雜度 ,使得\(pos\geqslant x \geqslant 1\)並且從\(x\)開始執行\(id\)到\(n\)號操作走不到\(0\)。
並且之後的操作都執行完也不會到\(0\)。
題目傳送門: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\)
我們設\(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]\)
時間復雜度:\(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