【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 = ( ...
随机推荐
- int[]里数的个数怎么由输入决定?-----动态数组。
java中如何创建动态数组?(摘自百度知道) Java动态数组是一种可以任意伸缩数组长度的对象,在Java中比较常用的是ArrayList,ArrayList是javaAPI中自带的java.util ...
- MySQL学习——数据类型
MySQL学习——数据类型 摘要:本文主要学习了MySQL数据库的数据类型. 整数类型 MySQL主要提供的整数类型有tinyint.smallint.mediumint.int.bigint,其属性 ...
- SSM框架之Mybatis(1)入门
Mybatis(1)入门 1.mybatis的概述 mybatis是一个持久层框架,用java编写的. 它封装了jdbc操作的很多细节,使开发者只需要关注sql语句本身,而无需关注注册驱动,创建连接等 ...
- SAP MM 特殊库存之T库存初探
SAP MM 特殊库存之T库存初探 笔者所在的A项目里,销售业务广泛启用了POD功能.VL02N对交货单做了发货过账后物权并没有转移,而是将自有E库存转为一个叫做在途库存的特殊库存里.等到货物到了客户 ...
- 1042. Flower Planting With No Adjacent
题意: 本题题意为: 寻找一个花园的涂色方案,要求 1.花园和花园之间,不能有路径连接的,不能涂成相同颜色的 一共有4中颜色,花园和花园之间,至多有三条路径 我菜了 - - ,又没做出来.. 看答案 ...
- 如果下载老版本的Xcode
打开:https://developer.apple.com/download/more/,选择符合自己的Xcode版本即可.
- [b0002] Hadoop HDFS cmd常用命令练手
目的: 学会HDFS CLI 常用操作 环境: Hadoop 2.6.4 伪分布式版 环境搭建参考本博客前篇文章: 伪分布式 hadoop 2.6.4 帮助: hadoop@ssmaster:~$ h ...
- 安装quickLook插件以及解决如何不能读取offic问题
目录 @(安装quickLook插件) quickLook插件是Mac上的快速浏览的一个功能,现在win10系统上也能安装插件,这个插件可以快速浏览txt,doc,图片,表格等文件如下图: 我认为最方 ...
- Python—基本数据类型
核心数据类型: 数字(int整型.float浮点型.complex复数.bool布尔型) 字符串 str 列表(List) 元组(Tuple) 字典(Dictionary) 集合() 数字 整数,浮点 ...
- [PHP] PHP PDO与mysql的连接单例防止超时情况处理
这个数据库类主要处理了单例模式下创建数据库对象时,如果有两次较长时间的间隔去执行sql操作,再次处理会出现连接失败的问题,利用一个cache数组存放pdo对象与时间戳,把两次执行之间的时间进行了比较, ...