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

题面

UOJ

题解

不难发现一定是每次找到离当前位置最近的一个箱子,然后把它搬过来。

那么如果我们能够确定起始位置,我们就可以二分从两侧多少距离搬箱子,判断一下时间就好了。

考虑起始位置,发现一定可以让起始位置有箱子,因为这东西本质上就是一个中位数的模型。

考虑二分答案,于是我们要求的就变成了取\(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】轴仓库的更多相关文章

  1. uoj #49. 【UR #3】铀仓库

    http://uoj.ac/problem/49 这题二分答案可以做,同时存在另一个直接二分的解法. 考虑对每个点,二分能向左右延伸的最大半径,由于权值范围较大,不能O(1)查询向一侧走指定距离后到达 ...

  2. UOJ 【UR #5】怎样跑得更快

    [UOJ#62]怎样跑得更快 题面 这个题让人有高斯消元的冲动,但肯定是不行的. 这个题算是莫比乌斯反演的一个非常巧妙的应用(不看题解不会做). 套路1: 因为\(b(i)\)能表达成一系列\(x(i ...

  3. UOJ #22 UR #1 外星人

    LINK:#22. UR #1 外星人 给出n个正整数数 一个初值x x要逐个对这些数字取模 问怎样排列使得最终结果最大 使结果最大的方案数又多少种? n<=1000,x<=5000. 考 ...

  4. UOJ.52.[UR #4]元旦激光炮(交互 思路)

    题目链接 \(Description\) 交互库中有三个排好序的,长度分别为\(n_a,n_b,n_c\)的数组\(a,b,c\).你需要求出所有元素中第\(k\)小的数.你可以调用至多\(100\) ...

  5. UOJ【UR #12】实验室外的攻防战

    题意: 给出一个排列$A$,问是否能够经过以下若干次变换变为排列$B$ 变换:若${A_i> A_i+1}$,可以${swap(A_i,A_i+1)}$ 考虑一个数字从A排列到B排列连出来的路径 ...

  6. uoj49 轴仓库

    题意: n叠箱子排成一线,第i叠箱子坐标为xi,竖直方向叠着ai个箱子. 可以花费+1s左移或右移一位,也可以在瞬间搬起一个位置的箱子,或将怀里的有且仅有一个箱子放下. 任意选择起点s(可以不与xi重 ...

  7. 部署docker-registry私有仓库

    部署docker-registry私有仓库 创建文件夹 sudo mkdir -p /var/docker-data/{registry,certs,auth} ​ sudo openssl req ...

  8. canvas 笔记整理

    canvas Retina 屏幕优化 /** * HiDPI Canvas Polyfill (1.0.9) * * Author: Jonathan D. Johnson (http://jonda ...

  9. Universial robot 运动学

    1 正运动学: 1.1 DH方法理解 第i个坐标系固连在第i个连杆的左端.轴i固连于i-1杆,在i-1杆的右端.  i坐标系固定在i杆上,随这i杆转动. 每个连杆有四个参数,第i个连杆: ai = ( ...

随机推荐

  1. python:王思聪究竟上了多少次热搜?

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 朱小五 凹凸玩数据 PS:如有需要Python学习资料的小伙伴可以加 ...

  2. 敏捷软件开发_实例1<二>

    敏捷软件开发_实例1 这本书的实例非常好,给了我非常多的启发.主要讲了两个实例,咖啡机和薪水支付实例,咖啡机实例比较简单并没有用什么设计模式,薪水支付实例用了很多设计模式,包括后面的打包等. 咖啡机实 ...

  3. GO基础之函数

    一.Go语言函数的格式 函数构成了代码执行的逻辑结构,在Go语言中,函数的基本组成为:关键字 func.函数名.参数列表.返回值.函数体和返回语句,每一个程序都包含很多的函数,函数是基本的代码块. 函 ...

  4. C++ 成员对象和封闭类

    01 成员对象与封闭类 类里有其他对象则该对象叫成员对象:有成员对象的类叫 封闭类: class CTyre // 轮胎类 { public: // 有参数构造函数 // 初始化成员变量m_radiu ...

  5. jquery-uploadfile的使用(多文件异步上传)

    需求 在页面端可以在页面不刷新情况下上传多个有大小限制的word文件,并返回文件保存的路径,同时可以删除误上传的文件. 准备 下载该插件 该插件依赖jquery1.9.1版本(其它不清楚)*在jsp页 ...

  6. python从入门到放弃之协程

    协程 协程,又称微线程,纤程.英文名Coroutine. 协程的概念很早就提出来了,但直到最近几年才在某些语言(如Lua)中得到广泛应用. 子程序,或者称为函数,在所有语言中都是层级调用,比如A调用B ...

  7. jira Licenses更新步骤

    有时候我们不想花钱使用jira,那么只有通过一个月以续期的方式来使用jira.下面提供下自己实测的方式 1.获取License Key 登录地址:https://my.atlassian.com 登录 ...

  8. 学习:SpringCloud(一)

    微服务: 微服务是一种架构模式或者一种架构风格,提倡将单一应用程序划分成一组小的服务==独立部署==,服务之间相互配合.相互协调,每个服务运行于自己的==进程==中. 服务与服务间采用轻量级通讯,如H ...

  9. [Go] gocron源码阅读-groutine与channel应用到信号捕获

    直接使用go 函数名()可以开启一个grountine,channel可以接收信息并且如果没有数据时会阻塞住channel对应的是底层数据结构的引用,复制channel和函数传参都是拷贝的引用make ...

  10. CodeForces - 1007A (思维+双指针)

    题意 https://vjudge.net/problem/CodeForces-1007A 对一个序列重排,使得新的数比原来的数大对应的位置个数最多. 思路 举个栗子,比如1 2 2 3 3 3 3 ...