Atcoder 题面传送门 & 洛谷题面传送门

首先求出 \(s_i\) 表示经过 \(i\) 次操作后机器人会位于什么位置,显然 \(s_0=D\),\(s_i=\min(s_{i-1},|s_{i-1}-a_i|)\)。

考虑修改某个位置的 \(a_i\) 的本质是什么。注意到不论你将 \(a_i\) 改为什么值,最终的 \(s_i\) 一定在 \([0,s_{i-1}]\) 中,也就是说我们需求出是否 \(\exist v\in [0,s_{i-1}]\) 使得将 \(s_i\) 改为 \(v\) 后经过 \(i+1\sim n\) 这 \(n-i\) 次操作,得到的值非零。

考虑二元函数 \(f(v,a[1\dots n])\) 表示 \(v\) 经过 \(a_1,a_2,\dots,a_n\) 的作用下得到的值。那么题目转化为是否 \(\exist v\in [0,s_{i-1}]\) 使得 \(f(v,a[i+1\dots n])\neq 0\)。我们考虑分析这个 \(f\) 函数的性质,首先非常明显的一点是 \(\forall v,f(v,a[1\dots n])\leq f(v+1,a[1\dots n])\),证明异常容易,考虑序列 \(s_0=v,s_i=\min(s_{i-1},|s_{i-1}-a_i|)\),以及序列 \(s'_0=v+1,s'_i=\min(s'_{i-1},|s'_{i-1}-a_i|)\),随便归纳一下就可以得到 \(s_i\leq s'_i\),故 \(s_n\leq s'_n\)。另一个需要注意到的地方是这里 \(0\) 的特殊性,u1s1 感觉很多题目都要用到 \(0\) 这样特殊的数的性质解题(譬如 CF258E),这个地方连 ycx 神仙都没想到。注意到 \(\forall v\geq 0\),\(f(v,a[1\dots n])\geq 0\),而 \(f(0,a[1\dots n])=0\),再结合前一个性质可知满足 \(f(v,a[1\dots n])=0\) 是一个形如 \([0,g]\) 的区间,也就是说最小的满足 \(f(v,a[1\dots n])\neq 0\) 的 \(v\) 为 \(g+1\)。

这样一来思路就有了。考虑设 \(g_i\) 表示满足 \(f(v,a[i\dots n])\neq 0\) 的最小的 \(v\)。显然 \(g_{n+1}=1,g_i\geq g_{i+1}\),考虑递推求出 \(g_i\),对于某个 \(i\) 我们有 \(f(g,a[i\dots n])>0\Leftrightarrow f(\min(g-a_{i},g),a[i+1\dots n])>0\)。这样就可以分情况讨论了,若 \(|g_{i+1}-a_{i+1}|\ge g_{i+1}\),那么 \(g_{i}=g_{i+1}\) 就符合条件,否则 \(\min(g_i,|g_i-a_{i+1}|)=g_i-a_{i+1}\),而我们要使得 \(g_i-a_{i+1}\geq g_{i+1}\),故 \(g_i=a_{i+1}+g_{i+1}\)。

时间复杂度线性。

#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define fill0(a) memset(a,0,sizeof(a))
#define fill1(a) memset(a,-1,sizeof(a))
#define fillbig(a) memset(a,63,sizeof(a))
#define pb push_back
#define ppb pop_back
#define mp make_pair
template<typename T1,typename T2> void chkmin(T1 &x,T2 y){if(x>y) x=y;}
template<typename T1,typename T2> void chkmax(T1 &x,T2 y){if(x<y) x=y;}
typedef pair<int,int> pii;
typedef long long ll;
typedef unsigned int u32;
typedef unsigned long long u64;
namespace fastio{
#define FILE_SIZE 1<<23
char rbuf[FILE_SIZE],*p1=rbuf,*p2=rbuf,wbuf[FILE_SIZE],*p3=wbuf;
inline char getc(){return p1==p2&&(p2=(p1=rbuf)+fread(rbuf,1,FILE_SIZE,stdin),p1==p2)?-1:*p1++;}
inline void putc(char x){(*p3++=x);}
template<typename T> void read(T &x){
x=0;char c=getchar();T neg=0;
while(!isdigit(c)) neg|=!(c^'-'),c=getchar();
while(isdigit(c)) x=(x<<3)+(x<<1)+(c^48),c=getchar();
if(neg) x=(~x)+1;
}
template<typename T> void recursive_print(T x){if(!x) return;recursive_print(x/10);putc(x%10^48);}
template<typename T> void print(T x){if(!x) putc('0');if(x<0) putc('-'),x=~x+1;recursive_print(x);}
void print_final(){fwrite(wbuf,1,p3-wbuf,stdout);}
}
const int MAXN=5e5;
int n,qu,a[MAXN+5],b[MAXN+5];
int main(){
scanf("%d%d",&n,&a[0]);b[n+1]=1;
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=n;i;i--) b[i]=(b[i+1]<=a[i]/2)?b[i+1]:b[i+1]+a[i];
for(int i=1;i<=n;i++) a[i]=min(a[i-1],abs(a[i-1]-a[i]));
scanf("%d",&qu);while(qu--){int x;scanf("%d",&x);printf("%s\n",(a[x-1]>=b[x+1])?"YES":"NO");}
return 0;
}

Atcoder Regular Contest 072 C - Alice in linear land(思维题)的更多相关文章

  1. 【arc072e】AtCoder Regular Contest 072 E - Alice in linear land

    题意 给定一个D,以及一个长度为N的序列a,顺序执行这些数字: 对于一个数字x,会使得D=min(D,abs(D-x)) 有Q次询问,每次询问独立,给出i,能否修改a[i],使得D最后不为0. n,q ...

  2. AtCoder Regular Contest 072 E:Alice in linear land

    题目传送门:https://arc072.contest.atcoder.jp/tasks/arc072_c 题目翻译 给你一个数组\(D\),然后给你一个操作序列\(d\),每次操作可以将\(D\) ...

  3. 【arc072f】AtCoder Regular Contest 072 F - Dam

    题意 有一个体积为L的水池,有N天 每天早上进水Vi体积的Ti温度的水. 每天晚上可以放掉任意体积的水. 问每天中午,水池满的情况下,水温最高多少. 水的温度只受新加进的谁的影响,对于水\(W1(T1 ...

  4. Atcoder Grand Contest 005 E - Sugigma: The Showdown(思维题)

    洛谷题面传送门 & Atcoder 题面传送门 记先手移动棋子的树为红树,后手移动棋子的树为蓝树. 首先考虑一个性质,就是如果与当前红色棋子所在的点相连的边中存在一条边,满足这条边的两个端点在 ...

  5. AtCoder Regular Contest 061

    AtCoder Regular Contest 061 C.Many Formulas 题意 给长度不超过\(10\)且由\(0\)到\(9\)数字组成的串S. 可以在两数字间放\(+\)号. 求所有 ...

  6. AtCoder Regular Contest 094 (ARC094) CDE题解

    原文链接http://www.cnblogs.com/zhouzhendong/p/8735114.html $AtCoder\ Regular\ Contest\ 094(ARC094)\ CDE$ ...

  7. AtCoder Regular Contest 092

    AtCoder Regular Contest 092 C - 2D Plane 2N Points 题意: 二维平面上给了\(2N\)个点,其中\(N\)个是\(A\)类点,\(N\)个是\(B\) ...

  8. AtCoder Regular Contest 093

    AtCoder Regular Contest 093 C - Traveling Plan 题意: 给定n个点,求出删去i号点时,按顺序从起点到一号点走到n号点最后回到起点所走的路程是多少. \(n ...

  9. AtCoder Regular Contest 094

    AtCoder Regular Contest 094 C - Same Integers 题意: 给定\(a,b,c\)三个数,可以进行两个操作:1.把一个数+2:2.把任意两个数+1.求最少需要几 ...

随机推荐

  1. Bootstrap移动端导航(简易)

    效果 在线查看 代码少,都在HTML里 <!DOCTYPE html> <html lang="en"> <head> <meta cha ...

  2. C#特性知识图谱-一、委托

    一. 委托 1.1 委托定义 委托可以看成是一个方法的容器,将某一具体的方法装入后就可以把它当成方法一样调用.一个委托类型的变量可以引用任何一个满足其要求的方法.委托类似于C语言中的函数指针,但并不完 ...

  3. 分库分表利器之Sharding Sphere(深度好文,看过的人都说好)

    Sharding-Sphere Sharding-JDBC 最早是当当网内部使用的一款分库分表框架,到2017年的时候才开始对外开源,这几年在大量社区贡献者的不断迭代下,功能也逐渐完善,现已更名为 S ...

  4. Less-(38~41) 堆叠注入

    首先申明,Less-(38~41)可以采取和Less-(1~4)相同的解法:(一一对应) 然而,他们的漏洞其实更大,我们可以做更多具有破坏性的事情. 代码审计: Less-(38~41): 41的$s ...

  5. 【UE4 设计模式】装饰器模式 Decorator Pattern

    概述 描述 动态地给一个对象增加一些额外的职责(Responsibility),就增加对象功能来说,装饰模式比生成子类实现更为灵活.是一种对象结构型模式. 套路 抽象构件(Component) 具体构 ...

  6. 【数据结构与算法Python版学习笔记】算法分析

    什么是算法分析 算法是问题解决的通用的分步的指令的聚合 算法分析主要就是从计算资源的消耗的角度来评判和比较算法. 计算资源指标 存储空间或内存 执行时间 影响算法运行时间的其他因素 分为最好.最差和平 ...

  7. SpringBoot小知识点

    记录SpringBoot的小知识点 一.在 Spring 上下文刷新之前设置一些自己的环境变量 1.实现 EnvironmentPostProcessor 接口 2.spring.factories ...

  8. Noip模拟36 2021.8.11

    刚题的习惯还是改不了,怎么办??? T1 Dove打扑克 考场上打的动态开点线段树+并查集,考后发现自己像一个傻子,并查集就行.. 这几天恶补数据结构疯了 用树状数组维护后缀和,$siz_i$表示编号 ...

  9. 整数中1出现的次数 牛客网 剑指Offer

    整数中1出现的次数 牛客网 剑指Offer 题目描述 求出113的整数中1出现的次数,并算出1001300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此 ...

  10. VS 2013 配置份openGL环境

    几个要素: 1.  在E:\Microsoft Visual Studio 12.0\VC\include下创建GL文件夹,放入glut.h头文件. 2.  C:\Windows\System32下要 ...