【ARC072 E】Alice in linear land
被智商题劝退,告辞
题意
有一个人在一条数轴的距离原点为 \(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的更多相关文章
- 【ARC072E】Alice in linear land DP
题目大意 有一个人要去直线上\(lm\)远处的地方,他会依次给他的机器发出\(n\)个指令.第\(i\)个指令为\(d_i\).他的机器收到一个指令\(x\)后,如果向目的地方向前进\(xm\)后比当 ...
- 【ARC072E】Alice in linear land
题目 瑟瑟发抖,这竟然只是个蓝题 题意大概就是初始在\(0\),要到坐标为\(D\)的地方去,有\(n\)条指令,第\(i\)条为\(d_i\).当收到一条指令\(x\)后,如果向\(D\)方向走\( ...
- 【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 ...
- [AT2401] [arc072_e] Alice in linear land
题目链接 AtCoder:https://arc072.contest.atcoder.jp/tasks/arc072_c 洛谷:https://www.luogu.org/problemnew/sh ...
- ARC072E Alice in linear land
---题面--- 题解: 首先我们要观察到一个性质,因为在固定的起始距离下,经过固定的操作,最后所在的位置是固定的,我们设经过操作1 ~ i之后所在的地方距离终点为d[i]. 那么如果女巫可以修改第i ...
- AtCoder Regular Contest 072 E:Alice in linear land
题目传送门:https://arc072.contest.atcoder.jp/tasks/arc072_c 题目翻译 给你一个数组\(D\),然后给你一个操作序列\(d\),每次操作可以将\(D\) ...
- 【深度学习】线性回归(Linear Regression)——原理、均方损失、小批量随机梯度下降
1. 线性回归 回归(regression)问题指一类为一个或多个自变量与因变量之间关系建模的方法,通常用来表示输入和输出之间的关系. 机器学习领域中多数问题都与预测相关,当我们想预测一个数值时,就会 ...
- 【POJ 1698】Alice's Chance(二分图多重匹配)
http://poj.org/problem?id=1698 电影和日子匹配,电影可以匹配多个日子. 最多有maxw*7个日子. 二分图多重匹配完,检查一下是否每个电影都匹配了要求的日子那么多. #i ...
- Atcoder Regular Contest 072 C - Alice in linear land(思维题)
Atcoder 题面传送门 & 洛谷题面传送门 首先求出 \(s_i\) 表示经过 \(i\) 次操作后机器人会位于什么位置,显然 \(s_0=D\),\(s_i=\min(s_{i-1},| ...
随机推荐
- C语言递归之对称二叉树
题目描述 给定一个二叉树,检查它是否是镜像对称的. 示例 二叉树 [1,2,2,3,4,4,3] 是对称的. / \ / \ / \ [1,2,2,null,3,null,3] 则不是镜像对称的. / ...
- etcd配置参数详解
针对ETCD版本 3.2.17 --name 节点名称 default: "default" env variable: ETCD_NAME 这个值和--initial-clust ...
- vue60秒倒计时
wait:"60", content:"验证码", canClick: true, daojishi(){ if(!this.canClick) return ...
- Spring MVCD框架中调用HanLP分词的方法
项目简要:关于java web的一个项目,用的Spring MVCd 框架.鉴于参与此次项目的人中并不是所人都做的Spring,为了能够提高效率,建议大家是先抛开SPring来写自己负责的模块,最后再 ...
- SpreadJS V13.0发布,聚焦表单设计与数据交互,让您的工作效率突飞猛进!
纯前端表格控件SpreadJS,是一款成功应用于华为.招商银行.天弘基金.苏宁易购等国内外知名企业的前端开发工具,其带来的价值不仅体现在帮助开发人员在其Web应用程序中快速构建 Web Excel . ...
- hdu 1506 直方图内最大矩形
题目传送门//res tp hdu 单调栈的经典问题 维护区间的左右边界计算面积即可 #include<iostream> #include<algorithm> #inclu ...
- C++中如何调用DLL文件
一.动态链接库简介 动态库链接库英文位DLL,是Dynamic Link Library的缩写形式,DLL不是可执行文件.动态链接提供了一种方法,使进程可以调用不属于其可执行文件代码的函数.函数可执行 ...
- [POI2011]ROT-Tree Rotations 题解
题面 这道题咋看都是无法从dp入手,那么就从数据结构入手!: 首先你要会权值线段树和线段树合并. 然后你要知道: 对于任意一个节点,交换左右子树对当前节点和前面的所有节点没有影响. 因为这是前序遍历: ...
- 从入门到自闭之Python集合,深浅拷贝(大坑)
小数据池 int: -5~256 str: 字母,数字长度任意符合驻留机制 字符串进行乘法时总长度不能超过20 特殊符号进行乘法时只能乘以0 代码块: 一个py文件,一个函数,一个模块,终端中的每一行 ...
- Web前端开发JavaScript提高
JavaScript 一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型,它的解释器被称为JavaScript引擎,是浏览器的一部分,并且是被广泛用于客户端的脚本语言,JavaS ...