[ARC072C]Alice in linear land(dp,贪心)
[ARC072C]Alice in linear land
Description
給定a1...ana_1...a_na1?...an?和DDD,mmm輪詢問,每輪詢問給你一個qqq,可以讓你任意修改aqa_qaq?的值,然后從小到大對于每一個iii讓D=min(D,D?ai)D=min(D,D-a_i)D=min(D,D?ai?),問最后是否能讓D=0D=0D=0,詢問兩兩獨立。
n,m≤5?105n,m\leq 5*10^5n,m≤5?105
Solution
若能修改的是第xxx個數,顯然a1...ax?1a_1...a_{x-1}a1?...ax?1?操作完之后的DDD與修改成什么無關,可以直接預處理出a1...aka_1...a_ka1?...ak?操作后DDD的值dkd_kdk?。
然后對于ax...ana_x...a_nax?...an?,若存在一個數y≤dx?1y\leq d_{x-1}y≤dx?1?,且yyy在ax...ana_x...a_nax?...an?操作后不為000,則答案為YESYESYES,否則為NONONO。
因此現在相當于要求出一個最小的yxy_xyx?,使得yxy_xyx?在ax...ana_x...a_nax?...an?操作之后不為000。我們設yx+1y_{x+1}yx+1?為ax+1...ana_{x+1}...a_nax+1?...an?操作后不為000的最小的yyy,考慮如何用yx+1y_{x+1}yx+1?求出yxy_xyx?。
- 當yx+1≤ax2y_{x+1}\leq \frac{a_x}{2}yx+1?≤2ax??時,顯然yx=yx+1y_x=y_{x+1}yx?=yx+1?。
- 當yx+1>ax2y_{x+1}> \frac{a_x}{2}yx+1?>2ax??時,顯然yx=yx+1+axy_x=y_{x+1}+a_xyx?=yx+1?+ax?。
那么這樣做會不會存在一個yx′<yxy'_x<y_xyx′?<yx?也滿足條件呢?可以發現這是不可能的,因為按照定義yx′y'_{x}yx′?一定由yx+1′≥yx+1y'_{x+1}\geq y_{x+1}yx+1′?≥yx+1?轉移過來。
- 當yx+1′≤ax2y'_{x+1}\leq \frac{a_x}{2}yx+1′?≤2ax??時,yx′=yx+1′,yx=yx+1,yx≤yx′y'_x=y'_{x+1},y_x=y_{x+1},y_x\leq y'_xyx′?=yx+1′?,yx?=yx+1?,yx?≤yx′?。
- 當yx+1′>ax2y'_{x+1}> \frac{a_x}{2}yx+1′?>2ax??時,yx′=yx+1′+axy'_x=y'_{x+1}+a_xyx′?=yx+1′?+ax?,此時yxy_xyx?要么為yx+1y_{x+1}yx+1?,要么為yx+1+axy_{x+1}+a_xyx+1?+ax?,顯然yx≤yx′y_x\leq y'_xyx?≤yx′?。
因此可證得,我們從后往前遞推得到得必然為最小滿足條件的yyy,于是預處理出所有后綴的yyy,即可O(1)O(1)O(1)回答詢問。
時間復雜度O(n+m)O(n+m)O(n+m)。
Code
#include <vector> #include <list> #include <map> #include <set> #include <deque> #include <queue> #include <stack> #include <bitset> #include <algorithm> #include <functional> #include <numeric> #include <utility> #include <sstream> #include <iostream> #include <iomanip> #include <cstdio> #include <cmath> #include <cstdlib> #include <cctype> #include <string> #include <cstring> #include <ctime> #include <cassert> #include <string.h> //#include <unordered_set> //#include <unordered_map> //#include <bits/stdc++.h>#define MP(A,B) make_pair(A,B) #define PB(A) push_back(A) #define SIZE(A) ((int)A.size()) #define LEN(A) ((int)A.length()) #define FOR(i,a,b) for(int i=(a);i<(b);++i) #define fi first #define se secondusing namespace std;template<typename T>inline bool upmin(T &x,T y) { return y<x?x=y,1:0; } template<typename T>inline bool upmax(T &x,T y) { return x<y?x=y,1:0; }typedef long long ll; typedef unsigned long long ull; typedef long double lod; typedef pair<int,int> PR; typedef vector<int> VI;const lod eps=1e-11; const lod pi=acos(-1); const int oo=1<<30; const ll loo=1ll<<62; const int mods=998244353; const int MAXN=600005; const int INF=0x3f3f3f3f;//1061109567 /*--------------------------------------------------------------------*/ inline int read() {int f=1,x=0; char c=getchar();while (c<'0'||c>'9') { if (c=='-') f=-1; c=getchar(); }while (c>='0'&&c<='9') { x=(x<<3)+(x<<1)+(c^48); c=getchar(); }return x*f; } int a[MAXN],b[MAXN],mn[MAXN]; signed main() {int n=read(),D=read(); b[0]=D;for (int i=1;i<=n;i++) a[i]=read(),b[i]=min(b[i-1],abs(b[i-1]-a[i]));mn[n+1]=1;for (int i=n;i>=1;i--) mn[i]=(mn[i+1]<=a[i]/2?mn[i+1]:mn[i+1]+a[i]);int m=read();for (int i=1;i<=m;i++){int x=read();puts(b[x-1]>=mn[x+1]?"YES":"NO");}return 0; }總結
以上是生活随笔為你收集整理的[ARC072C]Alice in linear land(dp,贪心)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GOM和GEE引擎黑屏不显示界面,装备地
- 下一篇: [ARC073C] Ball Color