AtCoder agc007_d Shik and Game
洛谷题目页面传送门 & AtCoder题目页面传送门
有\(1\)根数轴,Shik初始在位置\(0\)。数轴上有\(n\)只小熊,第\(i\)只在位置\(a_i\)。Shik每秒可以向左移动\(1\)个单位长度、原地不动或向右移动\(1\)个单位长度。Shik第\(1\)次到某个小熊的位置\(s\)秒后,小熊会在原地生产\(1\)个金币,Shik必须再次到达此小熊的位置才能收集金币。求Shik收集完所有金币后到达位置\(m\)所花的最小秒数。
\(n\in\left[1,10^5\right],a_i\in(0,m),a_i<a_{i+1}\)。
考虑最优情况下,Shik的路线会是怎样的。如果Shik经过了一些小熊,回头收集了这些小熊中后面一部分的金币,然后继续往终点走,留下前面一部分金币等到以后再收,这样肯定不是最优的(感性理解)。可以推出若一个小熊的金币被收了,那么它前面的所有小熊的金币都被收了,即被收了金币的小熊序列是所有小熊序列的一个前缀。考虑将某时刻的前缀分成若干个区间,每个区间内的小熊都是在一次回头中被收了金币的,于是我们就可以DP了。
设\(dp_i\)表示Shik收完了前\(i\)个小熊的金币并回到了位置\(a_i\)所花的最小秒数。不妨设\(a_0=0\)为起点。那么显然边界是\(dp_0=0\),目标是\(dp_n+m-a_n\)。转移的话,枚举当前被收了金币的小熊前缀被划分的最后一个区间的左端点的前一个小熊\(j\),即最后一次回头之前\([1,j]\)已经被收了。那么最后一次回头收的是\([j+1,i]\)。显然,路线是这样的:先将前\(j\)个小熊的金币收完,回到位置\(a_j\),然后\(a_j\to a_i\)经过\([j+1,i]\)使它们生产金币,然后\(a_i\to a_{j+1}\)回头到第\(j+1\)个小熊,等待若干秒直到第\(j+1\)个小熊生产金币,然后\(a_{j+1}\to a_i\)依次收完\([j+1,i]\)的金币并回到位置\(a_i\)。那么状态转移方程就很好列了:
\]
即
\]
暴力转移显然是\(\mathrm O\!\left(n^2\right)\)的,于是考虑优化。注意到方程里有个\(\max\)很不好处理,于是分类讨论,分成\(s-2a_i+2a_{j+1}\ge0\)和\(s-2a_i+2a_{j+1}<0\)这\(2\)种。此时方程变为了:(化简后)
\]
将关于决策变量\(j\)的放到一起,关于状态变量\(i\)的和常量放到一起,得
\]
\(2\)个\(\min\)的条件里的\(2a_{j+1}\)显然有单调性,所以\(2\)个\(\min\)取的\(j\)都构成区间。特殊地,对于第\(2\)个\(\min\),是前缀,即左端点为\(0\)的区间。又因为\(2a_i-s\)也有单调性,所以第\(1\)个\(\min\)的区间左端点单调递增,对于每个\(i\),这个左端点可以two-pointers求出。于是对于第\(1\)个\(\min\)维护单调队列,对于第\(2\)个\(\min\)维护前缀最小值,\(\mathrm O(n)\)。
下面贴代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long//防爆int
const int inf=0x3f3f3f3f3f3f3f3f;
const int N=100000;
int n/*小熊个数*/,m/*终点*/,s/*小熊被Shik碰到至生产金币之间的秒数*/;
int a[N+1];//小熊的位置
int dp[N+1];//dp[i]表示Shik收完了前i个小熊的金币并回到了位置a[i]所花的最小秒数
int q[N],head,tail;//对于第1个min维护的单调队列
signed main(){
cin>>n>>m>>s;
for(int i=1;i<=n;i++)cin>>a[i];
q[tail++]=0;//i=1,j=0满足2a[j+1]>=2a[i]-t,归第1个min,于是压入单调队列
int now=-1/*第2个min取的j构成的区间(前缀)的右端点*/,mn=inf/*当前的前缀最小值*/;
for(int i=1;i<=n;i++){
while(now+1<i&&2*a[now+2]<2*a[i]-s)now++,mn=min(mn,dp[now]-a[now]-2*a[now+1]);//将now往后移
while(head<tail&&q[head]<=now)head++;//维护单调队列,弹出过时元素
while(head<tail&&dp[q[tail-1]]-a[q[tail-1]]>=dp[i-1]-a[i-1])tail--;//维护单调队列队尾严格单调递增性
q[tail++]=i-1;//将j=i-1入队
dp[i]=min(dp[q[head]]-a[q[head]]+a[i]+s,mn+3*a[i]);//状态转移方程
}
cout<<dp[n]+m-a[n]<<"\n";//目标
return 0;
}
AtCoder agc007_d Shik and Game的更多相关文章
- AtCoder AGC007E Shik and Travel (二分、DP、启发式合并)
题目链接 https://atcoder.jp/contests/agc007/tasks/agc007_e 题解 首先有个很朴素的想法是,二分答案\(mid\)后使用可行性DP, 设\(dp[u][ ...
- 【AtCoder Grand Contest 007E】Shik and Travel [Dfs][二分答案]
Shik and Travel Time Limit: 50 Sec Memory Limit: 512 MB Description 给定一棵n个点的树,保证一个点出度为2/0. 遍历一遍,要求每 ...
- AtCoder Grand Contest 007 E:Shik and Travel
题目传送门:https://agc007.contest.atcoder.jp/tasks/agc007_e 题目翻译 现在有一个二叉树,除了叶子每个结点都有两个儿子.这个二叉树一共有\(m\)个叶子 ...
- AtCoder Grand Contest 007
AtCoder Grand Contest 007 A - Shik and Stone 翻译 见洛谷 题解 傻逼玩意 #include<cstdio> int n,m,tot;char ...
- AtCoder刷题记录
构造题都是神仙题 /kk ARC066C Addition and Subtraction Hard 首先要发现两个性质: 加号右边不会有括号:显然,有括号也可以被删去,答案不变. \(op_i\)和 ...
- AtCoder Regular Contest 061
AtCoder Regular Contest 061 C.Many Formulas 题意 给长度不超过\(10\)且由\(0\)到\(9\)数字组成的串S. 可以在两数字间放\(+\)号. 求所有 ...
- AtCoder Grand Contest 001 C Shorten Diameter 树的直径知识
链接:http://agc001.contest.atcoder.jp/tasks/agc001_c 题解(官方): We use the following well-known fact abou ...
- AtCoder Regular Contest 082
我都出了F了……结果并没有出E……atcoder让我差4分上橙是啥意思啊…… C - Together 题意:把每个数加1或减1或不变求最大众数. #include<cstdio> #in ...
- AtCoder Regular Contest 069 D
D - Menagerie Time limit : 2sec / Memory limit : 256MB Score : 500 points Problem Statement Snuke, w ...
随机推荐
- 吴裕雄--天生自然神经网络与深度学习实战Python+Keras+TensorFlow:TensorFlow与神经网络的实现
import tensorflow as tf import numpy as np ''' 初始化运算图,它包含了上节提到的各个运算单元,它将为W,x,b,h构造运算部件,并将它们连接 起来 ''' ...
- AspectRatio图片的宽高比、Card 卡片组件
一.AspectRatio 组件 AspectRatio 的作用是根据设置调整子元素 child 的宽高比. AspectRatio 首先会在布局限制条件允许的范围内尽可能的扩展,widget 的高度 ...
- c语言实现面向对象编程
1.通用校验器接口(validator.h) #ifndef VALIDATOR_H_INCLUDED #define VALIDATOR_H_INCLUDED #include<stdbool ...
- 安卓之文本视图TextView及跑马灯效果
一.基本属性和设置方法 二.跑马灯用到的属性与方法说明 三.省略方式的取值说明 四.跑马灯效果案例代码 (1)布局xml文件 <?xml version="1.0" en ...
- HeroM2连击技能设置和DB完整数据
连击技能设置: M2\选项\功能设置\技能魔法\通用技能\连击技能 魔法DB: 81;倚天辟地;0;55;5;10;10;5;6;6;99;15;5;15;10;15;15;60;; 300;万剑归宗 ...
- 第八届极客大挑战 Web-iPhone X
题目: 解题思路: 第一次看到html里只有字其他啥也没有的题,一脸懵逼,学长提示抓包改包,于是开始我的苦逼解题. 0x01 抓包 0x02 改包 由于题目说只有iphoneX才能接受这个websit ...
- windows jdk8
C:\Program Files (x86)\Java\jdk1.8.0_65 //JAVA_HOME .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.j ...
- ASP.NET Core搭建多层网站架构【2-公共基础库】
2020/01/28, ASP.NET Core 3.1, VS2019,Newtonsoft.Json 12.0.3, Microsoft.AspNetCore.Cryptography.KeyDe ...
- Linux - 重启wifi和网络
iwconfig sudo ifconfig wlp4s0 down sudo iwconfig wlp4s0 power off sudo ifconfig wlp4s0 up sudo servi ...
- 例题3_4 猜数字游戏的提示(UVa340)
实现一个经典“猜数字”游戏.给定答案序列和用户猜的序列,统计有多少数字位置正确(A),有多少数字在两个序列都出现过但位置不对(B). 输入包含多组数据.每组输入第一行为序列长度n,第二行是答案序列,接 ...