被智商题劝退,告辞

题意

  有一个人在一条数轴的距离原点为 \(D\) 的位置,他可以执行 \(n\) 次操作,每次操作为给定一个整数 \(d_i\),这个人向原点的方向走 \(d_i\) 个单位,但如果走 \(d_i\) 个单位后他离原点的距离更远了,他就不会执行这个操作。

  有 \(q\) 次询问,每次询问给定一个 \(y\),询问能否将 \(d_y\) 修改为 \([0,\infty)\) 内的整数(注意可以改成 \(0\)),使得这个人执行 \(n\) 次操作后到不了原点。询问之间互相独立,即每次单点修改都是在原序列的基础上修改。

  \(n\le 5\times 10^5\)

  \(1\le d_i,D\le 10^9\)

题解

  预处理出 \(y=1\cdots n\) 的答案。

  考虑单点修改的实质:设 \(sum_i\) 表示执行完前 \(i-1\) 次操作后人的位置,询问是否存在一个到原点距离为 \(d_i\in [0,sum_{i-1}]\) 的整点,使得从该点出发进行第 \(i+1\) 到 \(n\) 次操作后这个人到不了终点。

  因为本题的操作带条件,所以不能修改中间的某个操作。

  但是我们可以预处理出 \(b_i\) 表示执行第 \(i\) 到 \(n\) 个操作后到达原点的最大出发位置(即到原点距离最远的位置)。

  显然,答案是 yes 当且仅当 \(a_{y-1}\gt b_{y+1}\)(因为做一次操作只会使人到原点的距离变小或不变)。

  那怎么预处理 \(b_i\) 呢?

  构造一个函数 \(f(i)\) 表示人从距离原点为 \(i\) 的位置出发,执行一个参数为 \(k\) 的操作,到达距离原点 \(f(i)\) 的位置。

  \(k\) 任取一个数 \(9\),则把函数 \(f\) 打表

x | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | \(\cdots\)

-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|

y | 1 | 2 | 3 | 4 | 4 | 3 | 2 | 1 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | \(\cdots\)

  搬用官方题解的 \(x,y\) 图象(横轴是 \(x\),纵轴是 \(y\))

  

  但我们可以通过修改 \(d_i\) 来得到 \([0,sum_{i-1}]\) 中的任意整数,所以我们把整个区间 \([0,i]\) 作为一个新函数 \(F\) 的自变量,\(F(i)\) 表示人从一个可能位于的区间 \([0,i]\) 出发,执行一个参数为 \(k\) 的操作,能到达的区间为 \([0,F(i)]\)。显然,\(F(i)\le i\),即人可能位于的区间随着操作的增加而缩小。

  这里写一下 \(F(i)\) 的等式:\(F(i)=\min(i,\max(i-k,\lfloor \frac{k}{2}\rfloor))\)

  观察定义,还可以发现 \(F(i)\) 实际上就是 \(\max(f(j)\space |\space j\in [1,i])\)。

  依然取 \(k\) 为 \(9\),把函数 \(F\) 打表

x | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | \(\cdots\)

-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|

y | 1 | 2 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | \(\cdots\)

  因为 \(b_{n+1}=0\),所以 \(b\) 数组可以倒推。现在我们考虑从某一个区间撤回一次操作所返回的区间。

  设 \(F\) 的逆函数 \(G(i)\) 表示人从一个可能位于的区间 \([0,i]\) 撤回一个参数为 \(k\) 的操作,能到达的最大区间(因为我们要求 \(b_i\) 是合法的最大出发位置)

  观察函数 \(F\) 的表可得 $$G(i) = \begin{cases} i &(i\le \lfloor\frac{k}{2}\rfloor) \ i+k &(i\gt \lfloor\frac{k}{2}\rfloor) \end{cases}$$

  于是倒推出 \(b\) 数组即可,根据 \(a_{y-1}\gt b_{y+1}\) 判断 yes / no 就行了。

  复杂度 \(O(n)\)。

#include<bits/stdc++.h>
#define ll long long
#define N 500005
using namespace std;
inline ll read(){
ll x=0; bool f=1; char c=getchar();
for(;!isdigit(c); c=getchar()) if(c=='-') f=0;
for(; isdigit(c); c=getchar()) x=(x<<3)+(x<<1)+(c^'0');
if(f) return x;
return 0-x;
}
int n,q;
ll a[N+3],s[N+3],lim[N+3];
int main(){
n=read(), s[0]=read();
for(int i=1; i<=n; i++){
a[i]=read();
s[i]=min(abs(s[i-1]-a[i]),s[i-1]);
}
lim[n+1]=0;
for(int i=n; i>=1; i--){
if(lim[i+1]>=a[i]/2) lim[i]=lim[i+1]+a[i];
else lim[i]=lim[i+1];
}
q=read(); int x;
while(q--) x=read(), puts(lim[x+1]<s[x-1]?"YES":"NO");
return 0;
}

【ARC072 E】Alice in linear land的更多相关文章

  1. 【ARC072E】Alice in linear land DP

    题目大意 有一个人要去直线上\(lm\)远处的地方,他会依次给他的机器发出\(n\)个指令.第\(i\)个指令为\(d_i\).他的机器收到一个指令\(x\)后,如果向目的地方向前进\(xm\)后比当 ...

  2. 【ARC072E】Alice in linear land

    题目 瑟瑟发抖,这竟然只是个蓝题 题意大概就是初始在\(0\),要到坐标为\(D\)的地方去,有\(n\)条指令,第\(i\)条为\(d_i\).当收到一条指令\(x\)后,如果向\(D\)方向走\( ...

  3. 【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 ...

  4. [AT2401] [arc072_e] Alice in linear land

    题目链接 AtCoder:https://arc072.contest.atcoder.jp/tasks/arc072_c 洛谷:https://www.luogu.org/problemnew/sh ...

  5. ARC072E Alice in linear land

    ---题面--- 题解: 首先我们要观察到一个性质,因为在固定的起始距离下,经过固定的操作,最后所在的位置是固定的,我们设经过操作1 ~ i之后所在的地方距离终点为d[i]. 那么如果女巫可以修改第i ...

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

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

  7. 【深度学习】线性回归(Linear Regression)——原理、均方损失、小批量随机梯度下降

    1. 线性回归 回归(regression)问题指一类为一个或多个自变量与因变量之间关系建模的方法,通常用来表示输入和输出之间的关系. 机器学习领域中多数问题都与预测相关,当我们想预测一个数值时,就会 ...

  8. 【POJ 1698】Alice's Chance(二分图多重匹配)

    http://poj.org/problem?id=1698 电影和日子匹配,电影可以匹配多个日子. 最多有maxw*7个日子. 二分图多重匹配完,检查一下是否每个电影都匹配了要求的日子那么多. #i ...

  9. Atcoder Regular Contest 072 C - Alice in linear land(思维题)

    Atcoder 题面传送门 & 洛谷题面传送门 首先求出 \(s_i\) 表示经过 \(i\) 次操作后机器人会位于什么位置,显然 \(s_0=D\),\(s_i=\min(s_{i-1},| ...

随机推荐

  1. 【AMAD】django-allauth

    简介 个人评分 简介 django-allauth1集成的Oauth API包括: Amazon (OAuth2) AngelList (OAuth2) Bitly (OAuth2) Dropbox ...

  2. layui select 联动渲染赋值不了数据的问题

    今天用 layui做select的时候,数据老是看不到,而且联动的数据是对不上的,看了网上一堆是 最后要用 form.render('select'); 这个是必须的, 但是我用了还是这样,其实是la ...

  3. 2019牛客暑期多校训练营(第四场)- J free

    题目链接:https://ac.nowcoder.com/acm/contest/884/J 题意:给定一个无向图,有n个点,m条边(n,m<=1e3),起点S.终点T,在可以将k条边的权值变为 ...

  4. java23种设计模式之四:建造者模式

    在软件开发过程中有时需要创建一个复杂的对象,这个复杂对象通常由多个子部件按一定的步骤组合而成.例如:在新招收一个员工时,对个人信息对象的创建,在不同的阶段,需要个人信息的内容也不一样,姓名.性别.年龄 ...

  5. shell中防止意外发生的两个实用的设置

    set -o nounset set -o errexit set -o nounset 在默认情况下,遇到不存在的变量,会忽略并继续执行,而这往往不符合预期,加入该选项,可以避免恶果扩大,终止脚本的 ...

  6. 利用PLSQL Developer对oracle中的数据进行备份恢复

    --以备份scott用户为例,目标(备份里面所有的对象)--切换到scottconn scott/tiger;--进入  工具-->导出用户对象  如图所示 创建表空间及用户名,并赋予权限 -- ...

  7. POSTGRESQL日期函数大全

    一:各个数据中的连接符 SqlServer的连接符:+(加号) Sqlite的连接符:.(点) PostgreSQL的连接符:||(或) 二: 今天在PostgreSQL计算日期的时候,翻了一些资料, ...

  8. php 合成图片,合成圆形图片

    合成图片方法 <?php class Share { /* * 生成分享图片 * */ function cre_share_study_img(){ $auth = json_decode(b ...

  9. socket传送文件格式的问题

    在python3中socket传送文件只能传送‘bytes'类型,如下例子: import socket client = socket.socket()client.connect(("l ...

  10. 使用filebeat给多个logstash传输数据

    1. filebeat.yml filebeat.inputs: - type: log enabled: true paths: - /var/log/messages - /var/log/dme ...