题意:

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 轴仓库的更多相关文章

  1. 【UOJ#49】【UR #3】轴仓库

    [UOJ#49][UR #3]轴仓库 题面 UOJ 题解 不难发现一定是每次找到离当前位置最近的一个箱子,然后把它搬过来. 那么如果我们能够确定起始位置,我们就可以二分从两侧多少距离搬箱子,判断一下时 ...

  2. Git 创建本地仓库

    前面已经搭好环境了,现在我们缺的是一个管理版本控制的仓库.这次的实验是在电脑本地创建本地仓库.指定路径 默认的位置是在你所安装Git的目录下.Git的仓库你可以建在你电脑的任何目录下(最好不要包含有中 ...

  3. bzoj 1096 [ZJOI2007]仓库建设(关于斜率优化问题的总结)

    1096: [ZJOI2007]仓库建设 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3234  Solved: 1388[Submit][Stat ...

  4. Github删除仓库文件夹问题集合

    记得上次使用GitHub,看时间提示,最近的一次,是三年前,而且都是长传文件,这次是删除文件,才发现删除库可以,但是删除库里的某个目录,就不行了,除非是下载下来,在GitHub把仓库删了重新添加.使用 ...

  5. 手把手教你使用数据可视化BI软件创建仓库可视化管理大屏

    灯果数据可视化BI软件是新一代人工智能数据可视化大屏软件,内置丰富的大屏模板,可视化编辑操作,无需任何经验就可以创建属于你自己的大屏.大家可以在他们的官网下载软件.   本文以仓库可视化管理大屏为例为 ...

  6. 【社工】NodeJS 应用仓库钓鱼

    前言 城堡总是从内部攻破的.再强大的系统,也得通过人来控制.如果将入侵直接从人这个环节发起,那么再坚固的防线,也都成为摆设. 下面分享一个例子,利用应用仓库,渗透到开发人员的系统中. 应用仓库 应用仓 ...

  7. 使用github远程仓库

    经过几天对github的研究,终于把自己想完成的给解决了,发现google真的有很多解释,但是很多也会出现一些bug,对于初学者真的很多烦恼,所以整理一份,能给初识github的你有所帮助 一,首先, ...

  8. git如何切换远程仓库

    场景 工作时可能由于git仓库的变动,需要我们将已有代码切换仓库.比如我们先用的gitlab,现在要切换到github上. 迁移命令 代码迁移其实也很简单. 先保证本地代码是最新代码 $ git pu ...

  9. Git学习笔记一:新建本地仓库及初始化

    1.百度搜索Git下载安装,直接按默认选项安装即可. 例如:Git-2.7.2-32-bit_setup.1457942412.exe 2.配置Git信息,建立版本仓库 (Alt+PrintScerr ...

随机推荐

  1. 1-vim-简介

    vi(visual interface)是Linux最经典的文本编辑器 vi的核心设计思想-让程序员的手指始终保持在键盘的核心区域,就能完成所有的编辑操作. vi的特点 没有图形界面 只能编辑文本内容 ...

  2. apache+tomcat配置负载均衡,实现http与websocket接口分压

    一.应用场景 在生产环境中,应用服务器(此文以tomcat为例)不免面临高访问量的压力,相比而言web服务器(此文以apache为例)能够承担更大的并发量.Apache本身带有一些模块,可以完成对应用 ...

  3. 关于EntityFramework 更新数据记录时字段全部更新问题和不从数据库中获取直接更新记录

    一.一直对这个比较疑惑感觉只修改一条数据记录的一个字段结果更新Savechages后跟踪生成sql竟然是全部被修改,感觉微软怎么这么傻,总觉得会有其它方式可以只更新部分字段,但一直没有找到相关设置,最 ...

  4. UVA11427 Expect the Expected 概率dp+全概率公式

    题目传送门 题意:小明每晚都玩游戏,每一盘赢的概率都是p,如果第一盘就赢了,那么就去睡觉,第二天继续玩:否则继续玩,玩到赢的比例大于p才去睡:如果一直玩了n盘还没完成,就再也不玩了:问他玩游戏天数的期 ...

  5. python 编写暴力破解mysql用户名密码

    本文摘自别人的,自己运行调试了一下#!/user/bin/env python#-*- coding:utf-8 -*- import pymysql#导入连接数据库的模块import sys cla ...

  6. 数组foreach

    简单使用 代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...

  7. Android android studio常用的一些快捷键以及常用权限

    android studio的常用快捷键:一.打印log:1.输入logt回车:  自动生成TAG的全局变量:private static final String TAG = "MainA ...

  8. zjoi 2008 树的统计——树链剖分

    比较基础的一道树链剖分的题 大概还是得说说思路 树链剖分是将树剖成很多条链,比较常见的剖法是按儿子的size来剖分,剖分完后对于这课树的询问用线段树维护——比如求路径和的话——随着他们各自的链向上走, ...

  9. 【Codeforces Round #429 (Div. 2) B】 Godsend

    [Link]:http://codeforces.com/contest/841/problem/B [Description] 两个人轮流对一个数组玩游戏,第一个人可以把连续的一段为奇数的拿走,第二 ...

  10. Struts2入门的第一个应用

    今天开始学习struts2技术,现在struts2的技术已经超过了struts1,所以本人就没有学习struts1了,当然这个肯定不会影响我们后面的学习,先来看一下工程的目录结构: 说明: query ...