题目大意

  有一个人要去直线上\(lm\)远处的地方,他会依次给他的机器发出\(n\)个指令。第\(i\)个指令为\(d_i\)。他的机器收到一个指令\(x\)后,如果向目的地方向前进\(xm\)后比当前离目的地更近,就会向前移动\(xm\),否则什么都不会做。

  现在,给你\(q\)个询问,第\(i\)个询问为\(a_i\),问你能不能改变\(d_{a_i}\),使得这个人不能到达目的地。你可以决定把\(d_{a_i}\)改成什么数。

  \(n,q\leq 500000,1\leq d_i\leq {10}^9\)

题解

  首先我们先算出执行前面\(i\)个指令后离终点的距离\(c_i\)

  暴力的做法是用DP算出\(g_{i,j}\):执行后面\(i\)~\(n\)的指令,离终点的距离为\(j\),执行完后能不能到达终点。

  然后就会发现一旦出现一个\(0\),后面的\(1\)就会无意义。(因为可以修改成直接走到\(0\)这里)

  那么我们只需要维护前面有多少个\(1\)。

  \(f_i\)表示执行后面\(i\)$n$的指令,前面$g_{i,0}$\(g_{0,f_i}\)全部是\(1\),\(g_{i,f_i+1}\)是\(0\)。

  那么如果\(d_i\leq 2f_{i+1}+1\),那么\(f_i=f_{i+1}+d_i\)。否则\(f_i=f_{i+1}\)。

  可以发现,第一种情况\(0\)~\(f_i\)之间不会有空洞。

  询问\(a_i\)时直接判断\(c_{a_i-1}\)是不是比\(f_{a_i+1}\)大。这样直接走到\(f_{a_i+1}+1\)就可以了。

  时间复杂度:\(O(n)\)

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<ctime>
#include<utility>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
int n,q;
ll m;
ll d[500010];
ll c[500010];
ll f[500010];
void rd(int &s)
{
int c;
while((c=getchar())<'0'||c>'9');
s=c-'0';
while((c=getchar())>='0'&&c<='9')
s=s*10+c-'0';
}
void rd(ll &s)
{
int c;
while((c=getchar())<'0'||c>'9');
s=c-'0';
while((c=getchar())>='0'&&c<='9')
s=s*10+c-'0';
}
int abs(int x)
{
return x>0?x:-x;
}
void yes()
{
putchar('Y');
putchar('E');
putchar('S');
putchar('\n');
}
void no()
{
putchar('N');
putchar('O');
putchar('\n');
}
int main()
{
#ifdef DEBUG
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
#endif
scanf("%d%lld",&n,&m);
int i;
ll x;
c[0]=m;
for(i=1;i<=n;i++)
{
rd(d[i]);
c[i]=min(c[i-1],abs(c[i-1]-d[i]));
}
f[n+1]=0;
for(i=n;i>=1;i--)
{
f[i]=f[i+1];
if(d[i]<=2*f[i+1]+1)
f[i]=max(f[i],f[i+1]+d[i]);
}
scanf("%d",&q);
for(i=1;i<=q;i++)
{
rd(x);
if(c[x-1]>f[x+1])
yes();
else
no();
}
return 0;
}

【ARC072E】Alice in linear land DP的更多相关文章

  1. 【ARC072E】Alice in linear land

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

  2. 【ARC072 E】Alice in linear land

    被智商题劝退,告辞 题意 有一个人在一条数轴的距离原点为 \(D\) 的位置,他可以执行 \(n\) 次操作,每次操作为给定一个整数 \(d_i\),这个人向原点的方向走 \(d_i\) 个单位,但如 ...

  3. 【BZOJ3291】Alice与能源计划 二分图最大匹配

    [BZOJ3291]Alice与能源计划 Description 在梦境中,Alice来到了火星.不知为何,转眼间Alice被任命为火星能源部长,并立刻面临着一个严峻的考验. 为了方便,我们可以将火星 ...

  4. 【线性代数】1-1:线性组合(Linear Combinations)

    title: [线性代数]1-1:线性组合(Linear Combinations) toc: true categories: Mathematic Linear Algebra date: 201 ...

  5. 【题解】ARC101F Robots and Exits(DP转格路+树状数组优化DP)

    [题解]ARC101F Robots and Exits(DP转格路+树状数组优化DP) 先删去所有只能进入一个洞的机器人,这对答案没有贡献 考虑一个机器人只能进入两个洞,且真正的限制条件是操作的前缀 ...

  6. 【BZOJ2073】[POI2004]PRZ 状压DP

    [BZOJ2073][POI2004]PRZ Description 一只队伍在爬山时碰到了雪崩,他们在逃跑时遇到了一座桥,他们要尽快的过桥. 桥已经很旧了, 所以它不能承受太重的东西. 任何时候队伍 ...

  7. 【CF506E】Mr. Kitayuta's Gift dp转有限状态自动机+矩阵乘法

    [CF506E]Mr. Kitayuta's Gift 题意:给你一个字符串s,你需要在s中插入n个字符(小写字母),每个字符可以被插在任意位置.问可以得到多少种本质不同的字符串,使得这个串是回文的. ...

  8. 【BZOJ1187】[HNOI2007]神奇游乐园 插头DP

    [BZOJ1187][HNOI2007]神奇游乐园 Description 经历了一段艰辛的旅程后,主人公小P乘坐飞艇返回.在返回的途中,小P发现在漫无边际的沙漠中,有一块狭长的绿地特别显眼.往下仔细 ...

  9. UOJ #17. 【NOIP2014】飞扬的小鸟 背包DP

    #17. [NOIP2014]飞扬的小鸟 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4902  Solved: 1879 题目连接 http:// ...

随机推荐

  1. MRO C3算法 super的运用

    -------------态度决定成败,无论情况好坏,都要抱着积极的态度,莫让沮丧取代热心.生命可以价值极高,也可以一无是处,随你怎么去选择.# --------------------------- ...

  2. H5 35-背景平铺属性

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. E. Superhero Battle

    链接 [https://codeforces.com/contest/1141/problem/E] 题意 怪物开始的生命值,然后第i分钟生命值的变化 问什么时候怪物生命值为非正 分析 有一个巨大的坑 ...

  4. Python3练习题求1000以内所有3和5的倍数的总和

    sum = 0 for i in range(1,1000):     if i%3 == 0 or i%5 == 0:         sum += i print(sum)

  5. http1.0 1.1 与2.0

    长连接 HTTP 1.0需要使用keep-alive参数来告知服务器端要建立一个长连接,而HTTP1.1默认支持长连接. HTTP是基于TCP/IP协议的,创建一个TCP连接是需要经过三次握手的,有一 ...

  6. Laravel 服务容器、服务提供器、契约实例讲解

        前言 刚开始看laravel服务容器.契约.服务提供器的确生涩难懂,不单单是概念繁多,而且实际的demo很难找(找是找到了,但难用啊),最后就隔一段时间看一遍,大概个十来遍,还真给看出个门道, ...

  7. [转帖]十分钟快速理解DPI和PPI,不再傻傻分不清!

    十分钟快速理解DPI和PPI,不再傻傻分不清! https://baijiahao.baidu.com/s?id=1605834796518990333&wfr=spider&for= ...

  8. 120. 单词接龙 (BFS)

    描述 给出两个单词(start和end)和一个字典,找到从start到end的最短转换序列 比如: 每次只能改变一个字母. 变换过程中的中间单词必须在字典中出现. 如果没有转换序列则返回0. 所有单词 ...

  9. 剑指offer(16)栈的压入、弹出序列

    题目: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈 ...

  10. 解决Jupyter notebook[import tensorflow as tf]报错

    参考: https://blog.csdn.net/caicai_zju/article/details/70245099