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. 关于keras框架的介绍以及操作使用

    Keras 是一个 Python 深度学习框架,可以方便地定义和训练几乎所有类型的深度学习模型.Keras 最开始是为研究人员开发的,其目的在于快速实验.我们可以进入网站主页 - Keras 中文文档 ...

  2. pycharm 服务器连接及一些问题解决

    主要介绍一下如何使用pycharm连接服务器并在服务器上炼丹,并对遇到的一个小问题进行说明. 目录 1,SSH连接 2,linux常用命令 3,配置anaconda 4,运行代码 5,一个常见错误 1 ...

  3. Alpha项目展示

    项目 内容 这个作业属于哪个课程 2021春季软件工程(罗杰 任健) 这个作业的要求在哪里 Alpha-项目展示 我们是谁 删库跑路对不队 我们在做什么 题士 进度如何 进度总览 一.项目与团队亮点 ...

  4. 生产环境部署springcloud微服务启动慢的问题排查

    今天带来一个真实案例,虽然不是什么故障,但是希望对大家有所帮助. 一.问题现象: 生产环境部署springcloud应用,服务部署之后,有时候需要10几分钟才能启动成功,在开发测试环境则没有这个问题. ...

  5. 示波器分析I2C时序波形图

    对于嵌入式开发的朋友来说,I2C协议实在是再熟悉不过了,有太多的器件,采用的都是通过I2C来进行相应的设置.今天,我们就随便聊聊这个I2C协议. I2C协议中最重要的一点是I2C地址.这个地址有7位和 ...

  6. SpringCloud 2020.0.4 系列之Hystrix看板

    1. 概述 老话说的好:沉默是金,有时适当的沉默,比滔滔不绝更加有效. 言归正传,前面我们聊了有关 Hystrix 降级熔断的话题,今天我们来聊聊如何使用 turbine 和 hystrix dash ...

  7. linux中dd命令

    转载:https://www.runoob.com/linux/linux-comm-dd.html Linux dd 命令用于读取.转换并输出数据. dd 可从标准输入或文件中读取数据,根据指定的格 ...

  8. 面试官问我JVM内存结构,我真的是

    面试官:今天来聊聊JVM的内存结构吧? 候选者:嗯,好的 候选者:前几次面试的时候也提到了:class文件会被类加载器装载至JVM中,并且JVM会负责程序「运行时」的「内存管理」 候选者:而JVM的内 ...

  9. Element - 日期禁用集合(持续更新)

    当前日期之前的日期禁用 <el-date-picker v-model="form.startTime" type="date" placeholder= ...

  10. java读取大文件内容到Elasticsearch分析(手把手教你java处理超大csv文件)

    现在需要快算分析一个2g的csv文件: 基于掌握的知识,使用java按行读取文件,批量导入数据到es, 然后利用es强大的聚合能力分析数据,2个小时搞定! package com.example.de ...