【UOJ#49】【UR #3】轴仓库
【UOJ#49】【UR #3】轴仓库
题面
题解
不难发现一定是每次找到离当前位置最近的一个箱子,然后把它搬过来。
那么如果我们能够确定起始位置,我们就可以二分从两侧多少距离搬箱子,判断一下时间就好了。
考虑起始位置,发现一定可以让起始位置有箱子,因为这东西本质上就是一个中位数的模型。
考虑二分答案,于是我们要求的就变成了取\(mid\)个箱子所需的最短时间。
因为取走的箱子在数轴上一定是连续的一段,我们考虑从左往右枚举一个\(s\),那么当且仅当\(r+1\)比\(l\)更远时才不会进行替换,否则选择\(r+1\)一定比选择\(l\)更优。此时\(l,r\)单增,直接在扫的过程中维护一下就好了。
然而上面这种方法需要把所有的\(a_i\)变成若干个\(1\)来考虑,所以复杂度是\(O(\log n(n+\sum a_i))\)。
而实际上这个过程可以省略掉大量重复操作,即只需要记录一下重复位置的选择个数就好了。
#include<iostream>
#include<cstdio>
using namespace std;
#define ll long long
#define MAX 500500
inline ll read()
{
ll x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
int n,x[MAX],a[MAX];
ll s1[MAX],s2[MAX],T;
bool check(ll mid)
{
int l=1,r=lower_bound(&s1[1],&s1[n+1],mid)-s1,L=a[1],R=mid-s1[r-1];
for(int i=1;i<=n;++i)
{
while(l<i&&r<=n)
{
ll v1=x[i]-x[l],v2=x[r]-x[i];
if(v1>v2)
{
int cnt=min(L,a[r]-R);
L-=cnt;R+=cnt;
if(!L)++l,L=a[l];
if(R==a[r])++r,R=0;
}
else break;
}
ll ret=(s1[i]-s1[l])*x[i]-(s2[i]-s2[l])+1ll*L*(x[i]-x[l])+(s2[r-1]-s2[i])-(s1[r-1]-s1[i])*x[i]+1ll*R*(x[r]-x[i]);
if(ret*2<=T)return true;
}
return false;
}
int main()
{
n=read();T=read();
for(int i=1;i<=n;++i)x[i]=read();
for(int i=1;i<=n;++i)a[i]=read(),s1[i]=s1[i-1]+a[i],s2[i]=s2[i-1]+1ll*a[i]*x[i];
ll l=0,r=s1[n],ret=0;
while(l<=r)
{
ll mid=(l+r)>>1;
if(check(mid))l=mid+1,ret=mid;
else r=mid-1;
}
printf("%lld\n",ret);
}
【UOJ#49】【UR #3】轴仓库的更多相关文章
- uoj #49. 【UR #3】铀仓库
http://uoj.ac/problem/49 这题二分答案可以做,同时存在另一个直接二分的解法. 考虑对每个点,二分能向左右延伸的最大半径,由于权值范围较大,不能O(1)查询向一侧走指定距离后到达 ...
- UOJ 【UR #5】怎样跑得更快
[UOJ#62]怎样跑得更快 题面 这个题让人有高斯消元的冲动,但肯定是不行的. 这个题算是莫比乌斯反演的一个非常巧妙的应用(不看题解不会做). 套路1: 因为\(b(i)\)能表达成一系列\(x(i ...
- UOJ #22 UR #1 外星人
LINK:#22. UR #1 外星人 给出n个正整数数 一个初值x x要逐个对这些数字取模 问怎样排列使得最终结果最大 使结果最大的方案数又多少种? n<=1000,x<=5000. 考 ...
- UOJ.52.[UR #4]元旦激光炮(交互 思路)
题目链接 \(Description\) 交互库中有三个排好序的,长度分别为\(n_a,n_b,n_c\)的数组\(a,b,c\).你需要求出所有元素中第\(k\)小的数.你可以调用至多\(100\) ...
- UOJ【UR #12】实验室外的攻防战
题意: 给出一个排列$A$,问是否能够经过以下若干次变换变为排列$B$ 变换:若${A_i> A_i+1}$,可以${swap(A_i,A_i+1)}$ 考虑一个数字从A排列到B排列连出来的路径 ...
- uoj49 轴仓库
题意: n叠箱子排成一线,第i叠箱子坐标为xi,竖直方向叠着ai个箱子. 可以花费+1s左移或右移一位,也可以在瞬间搬起一个位置的箱子,或将怀里的有且仅有一个箱子放下. 任意选择起点s(可以不与xi重 ...
- 部署docker-registry私有仓库
部署docker-registry私有仓库 创建文件夹 sudo mkdir -p /var/docker-data/{registry,certs,auth} sudo openssl req ...
- canvas 笔记整理
canvas Retina 屏幕优化 /** * HiDPI Canvas Polyfill (1.0.9) * * Author: Jonathan D. Johnson (http://jonda ...
- Universial robot 运动学
1 正运动学: 1.1 DH方法理解 第i个坐标系固连在第i个连杆的左端.轴i固连于i-1杆,在i-1杆的右端. i坐标系固定在i杆上,随这i杆转动. 每个连杆有四个参数,第i个连杆: ai = ( ...
随机推荐
- Python打包成exe文件很难?一分钟即可学会,并添加图标!
环境1.python 3.72.pyinstaller下载方式:2.1 python安装(略)2.2 安装pyinstaller打开DOS窗口输入以下命令:pip install pyinstalle ...
- java基础第十七篇之网络编程和装饰者模式
1:网络概述 1.1 网络的发展Net 1964年,美国人---> 阿帕网--->以太网Internet 1.2 网络的通信协议 windows电脑,android手机,Mac平板---& ...
- 使用JS通过Web API执行批量操作,多个操作是一个事务!
关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复235或者20161105可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong. ...
- Android 网络加载通用Loading
为了用户体验用好,App在网络请求时通常都会显示个进度显示圈圈,提示用户耐心等待,最脍炙人口的莫过于登录啦. 接下来我们就通过Dialog来实现,然后在BaseActivity,BaseFragmen ...
- pyecharts和echarts的混合使用
ECharts是一个由百度开发的纯 Javascript 的图表库,pyecharts是某三位大佬将ECharts移植到Python项目中的产物,在Python网站中可以更轻松的接入图表,但是个人感觉 ...
- Element-ui中为上传组件添加表单校验
vue所依赖的Element的UI库在使用其中的upload组件时,可能很大几率会遇到这个题,需要给upload组件添加表单校验 大家这里直接看代码就可以 <el-form-item class ...
- BayaiM__SQLLDR_linux_shell高级版
BayaiM__SQLLDR_linux_shell高级版 备注:1.因公司在职,商业机密,顾IP地方加了"*"号,你可以任意写一个数字做IP做就好.2.不要瞎BB,哥自己写的 ...
- express 将 Router 实例模块化
为了更好的组织代码,将 Router 实例进行模块化,将 get / post 等快捷方式放在Router上,而不是 App 上,然后将该 Router 作为中间件,use 到 server.js 上 ...
- 删除带外键的表【foreign key constraint fails】报错
title: 删除带外键的表[foreign key constraint fails]报错 date: 2018-08-02 21:59:06 tags: 数据库 --- 遥想当时正在学hibern ...
- MQTT linux centOS7 部署
系统版本centos7 X64 1.设置保存安装包路径 # cd /usr/local/src 2.开始下载源包 官网资源: https://mosquitto.org/files/source/ # ...