Atcoder Regular Contest 072 C - Alice in linear land(思维题)
首先求出 \(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(思维题)的更多相关文章
- 【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 ...
- AtCoder Regular Contest 072 E:Alice in linear land
题目传送门:https://arc072.contest.atcoder.jp/tasks/arc072_c 题目翻译 给你一个数组\(D\),然后给你一个操作序列\(d\),每次操作可以将\(D\) ...
- 【arc072f】AtCoder Regular Contest 072 F - Dam
题意 有一个体积为L的水池,有N天 每天早上进水Vi体积的Ti温度的水. 每天晚上可以放掉任意体积的水. 问每天中午,水池满的情况下,水温最高多少. 水的温度只受新加进的谁的影响,对于水\(W1(T1 ...
- Atcoder Grand Contest 005 E - Sugigma: The Showdown(思维题)
洛谷题面传送门 & Atcoder 题面传送门 记先手移动棋子的树为红树,后手移动棋子的树为蓝树. 首先考虑一个性质,就是如果与当前红色棋子所在的点相连的边中存在一条边,满足这条边的两个端点在 ...
- AtCoder Regular Contest 061
AtCoder Regular Contest 061 C.Many Formulas 题意 给长度不超过\(10\)且由\(0\)到\(9\)数字组成的串S. 可以在两数字间放\(+\)号. 求所有 ...
- AtCoder Regular Contest 094 (ARC094) CDE题解
原文链接http://www.cnblogs.com/zhouzhendong/p/8735114.html $AtCoder\ Regular\ Contest\ 094(ARC094)\ CDE$ ...
- AtCoder Regular Contest 092
AtCoder Regular Contest 092 C - 2D Plane 2N Points 题意: 二维平面上给了\(2N\)个点,其中\(N\)个是\(A\)类点,\(N\)个是\(B\) ...
- AtCoder Regular Contest 093
AtCoder Regular Contest 093 C - Traveling Plan 题意: 给定n个点,求出删去i号点时,按顺序从起点到一号点走到n号点最后回到起点所走的路程是多少. \(n ...
- AtCoder Regular Contest 094
AtCoder Regular Contest 094 C - Same Integers 题意: 给定\(a,b,c\)三个数,可以进行两个操作:1.把一个数+2:2.把任意两个数+1.求最少需要几 ...
随机推荐
- python pip使用国内镜像安装第三方库:命令行或PyCharm
python pip使用国内镜像安装第三方库:命令行或PyCharm 转载: https://blog.csdn.net/lly1122334/article/details/80646996
- JDK里常见容器总结
自己总结. 扩容 线程安全 是否支持null 的key 说明 hashmap 2*length 否 是 1.8以后增加红黑树.提高检索效率 hashtable 是 否 官方不建议使 ...
- Gopher们写if err != nil是否腻了?
效果 go里面没有try catch,比较类似的有panic() 和 recover()机制,但是代价太大了,他们的场景更多使用在"程序异常,无法继续往下执行了这种场景",比如配置 ...
- Seata分布式事务失败通知
一.背景 在我们使用Seata作为分布式事务时,有些时候我们的分布式时候并不是每次都可以成功的,而对于这些失败的分布式事务就需要进行通知.这篇文章简单记录一下如何实现通知. 二.功能实现 此处模拟邮件 ...
- 使用logstash的input file filter收集日志文件
使用logstash的input file filter收集日志文件 一.需求 二.实现步骤 1.前置知识 2.编写pipeline文件 3.Input 中 file 插件的部分参数解释: 4.启动l ...
- Noip模拟49 2021.9.7
T1 reverse 又一道板子打假的挂分题,直接挂到倒二.. 考场上思路神奇,居然想到用$bfs$建边然后跑最短路, 其实当时也想到了直接$bfs$,但是不知道为啥觉得$dij$屌就没直接打$bfs ...
- Shadertoy 教程 Part 3 - 矩形和旋转
Note: This series blog was translated from Nathan Vaughn's Shaders Language Tutorial and has been au ...
- Myod 选做
一.题目要求 1.复习c文件处理内容 2.编写myod.c 用myod XXX实现Linux下od -tc -tx XXX的功能 3.main与其他分开,制作静态库和动态库 4.编写Makefile ...
- Linux 内核网桥源码分析
Linux网桥源码的实现 转自: Linux二层网络协议 Linux网桥源码的实现 1.调用 在src/net/core/dev.c的软中断函数static void net_rx_action(st ...
- 浅议NetMQ常见模式和消息加密机制
浅议NetMQ常见模式和消息加密机制 概述 在传统企业级开发中,消息队列机制已经成为一种非常常见的技术实现手段,而基于NetMQ则看起来有点像一朵"奇葩",看起来从名字似乎是一个消 ...