uoj49 轴仓库
题意:
n叠箱子排成一线,第i叠箱子坐标为xi,竖直方向叠着ai个箱子。
可以花费+1s左移或右移一位,也可以在瞬间搬起一个位置的箱子,或将怀里的有且仅有一个箱子放下。
任意选择起点s(可以不与xi重合),初始时两手空空。
求从s出发,在T秒内,最多能够将多少个箱子集中在s点上。
n<=5e5.
标程:
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
const int N=;
ll n,t,x[N],a[N],sum[N],sumk[N],ss,l,r,ans;
bool check(ll k)
{
ll l=,r=lower_bound(sum+,sum+n+,k)-sum;
ll lc=a[],rc=k-sum[r-];
for (int i=;i<=n;i++)
{
while (l<i&&r<=n&&x[i]-x[l]>x[r]-x[i])
{
ll mm=min(lc,a[r]-rc);
lc-=mm;rc+=mm;
if (lc==) lc=a[++l];
if (rc==a[r]) r++,rc=;
}
ss=sumk[r-]-sumk[i]-x[i]*(sum[r-]-sum[i]) + x[i]*(sum[i]-sum[l])-(sumk[i]-sumk[l])
+lc*(x[i]-x[l])+rc*(x[r]-x[i]);
if (ss<=t) return ;
}
return ;
}
int main()
{
scanf("%lld%lld",&n,&t);t/=;
for (int i=;i<=n;i++) scanf("%lld",&x[i]);
for (int i=;i<=n;i++) scanf("%lld",&a[i]),sum[i]=sum[i-]+a[i],sumk[i]=sumk[i-]+a[i]*x[i];
l=;r=sum[n];
while (l<=r)
{
ll mid=(l+r)>>;
if (check(mid)) l=mid+,ans=mid;else r=mid-;
}
printf("%lld\n",ans);
return ;
}
题解:双指针+二分答案
直接双指针扫描不行吗?因为x坐标并不连续,而且有ai限制,所以选取区间左右端点不一定单调!我们希望能够转换问题。
二分答案取k个物品,如果存在一个S,使得S选取与之距离最近的k个物品时间花费<=T,那么这个k视为可达。
某性质:在相邻两个xi之间选取的S,在选物区间固定的情况下,花费时间T是一个一次函数(单调)。因而极值一定在有物品的点上,对于S只用枚举关键点即可。
这样我们就可以用双指针来解决问题了。(我在双指针这里想了好久)
从共选取k个物品入手,左右端点移动相同的长度。
设置lc和rc分别表示l指针指向的那一块取了lc个,最后r指针指向的那一块取了rc个。
如下图所示,当x[i]-x[l]>x[r]-x[i]时,移动左右端点,选择min(lc,a[r]-rc)的长度移动。

然后用前缀和计算一下所用的时间(注意公式的正确性)。
时间复杂度O(nlog(sum)).
uoj49 轴仓库的更多相关文章
- 【UOJ#49】【UR #3】轴仓库
[UOJ#49][UR #3]轴仓库 题面 UOJ 题解 不难发现一定是每次找到离当前位置最近的一个箱子,然后把它搬过来. 那么如果我们能够确定起始位置,我们就可以二分从两侧多少距离搬箱子,判断一下时 ...
- Git 创建本地仓库
前面已经搭好环境了,现在我们缺的是一个管理版本控制的仓库.这次的实验是在电脑本地创建本地仓库.指定路径 默认的位置是在你所安装Git的目录下.Git的仓库你可以建在你电脑的任何目录下(最好不要包含有中 ...
- bzoj 1096 [ZJOI2007]仓库建设(关于斜率优化问题的总结)
1096: [ZJOI2007]仓库建设 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3234 Solved: 1388[Submit][Stat ...
- Github删除仓库文件夹问题集合
记得上次使用GitHub,看时间提示,最近的一次,是三年前,而且都是长传文件,这次是删除文件,才发现删除库可以,但是删除库里的某个目录,就不行了,除非是下载下来,在GitHub把仓库删了重新添加.使用 ...
- 手把手教你使用数据可视化BI软件创建仓库可视化管理大屏
灯果数据可视化BI软件是新一代人工智能数据可视化大屏软件,内置丰富的大屏模板,可视化编辑操作,无需任何经验就可以创建属于你自己的大屏.大家可以在他们的官网下载软件. 本文以仓库可视化管理大屏为例为 ...
- 【社工】NodeJS 应用仓库钓鱼
前言 城堡总是从内部攻破的.再强大的系统,也得通过人来控制.如果将入侵直接从人这个环节发起,那么再坚固的防线,也都成为摆设. 下面分享一个例子,利用应用仓库,渗透到开发人员的系统中. 应用仓库 应用仓 ...
- 使用github远程仓库
经过几天对github的研究,终于把自己想完成的给解决了,发现google真的有很多解释,但是很多也会出现一些bug,对于初学者真的很多烦恼,所以整理一份,能给初识github的你有所帮助 一,首先, ...
- git如何切换远程仓库
场景 工作时可能由于git仓库的变动,需要我们将已有代码切换仓库.比如我们先用的gitlab,现在要切换到github上. 迁移命令 代码迁移其实也很简单. 先保证本地代码是最新代码 $ git pu ...
- Git学习笔记一:新建本地仓库及初始化
1.百度搜索Git下载安装,直接按默认选项安装即可. 例如:Git-2.7.2-32-bit_setup.1457942412.exe 2.配置Git信息,建立版本仓库 (Alt+PrintScerr ...
随机推荐
- 2018-2-13-win10-uwp-音频
title author date CreateTime categories win10 uwp 音频 lindexi 2018-2-13 17:23:3 +0800 2018-2-13 17:23 ...
- Spring 在Web中的应用
Spring 在Web中的应用 在web项目开发中,不会直接实例化ApplicationContext对象,如果想用到ApplicationContext,一般的步骤: 配置一个监听器ContextL ...
- 使用sql对比Mysql中数据库2个表结构
比较两个数据表的结构 SELECT column_name, max( CASE WHEN table_name = 'table1' AND table_schema = 'db1' THEN 'Y ...
- js 浮点数计算问题
//说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显.这个函数返回较为精确的加法结果. //调用:jsAdd(arg1,arg2) //返回值:arg1加上arg2的精确 ...
- 文档 所有空格变为Tab
遗憾的是记事本.word没有这个功能... 可以生成exe #include <cstdio> #include <cstdlib> #include <cmath> ...
- vscode编程nodejs初始安装
nodejs官网 http://nodejs.cn/ 1.安装nodejs,记得安装时勾选配置路径 在cmd中输入node,进去node环境即为安装成功. 2.安装vscode,并安装插件node e ...
- Java标识符&关键字
1. 标识符&关键字 [标识符]: Java 对各种变量.方法和类等要素命名时使用的字符序列称为标识符. 凡是自己可以起名字的地方都叫标识符 命名规则:(一定要遵守,不遵守就会报编译的错误) ...
- Dart编程布尔值
Dart为布尔数据类型提供内置支持.Dart中的布尔数据类型仅支持两个值true和false.关键字bool用于表示DART中的布尔值. 在dart中声明布尔变量的语法如下所示 bool var_na ...
- 高危预警|RDP漏洞或引发大规模蠕虫爆发,用户可用阿里云免费检测服务自检,建议尽快修复
2019年9月6日,阿里云应急响应中心监测到Metasploit-framework官方在GitHub空间公开了针对Windows远程桌面服务远程命令执行漏洞(CVE-2019-0708)的利用代码. ...
- DELPHI 异常处理2
今天在写用ADO从EXCEL导入数据的程序时,出现个错误,弄了很久都弄不好,最后还是用异常处理解决掉了. 数据中日期在导入之前要转换成日期格式,虽然说一个strtodate就可以转好了,但是数据中的日 ...