http://uoj.ac/problem/49

这题二分答案可以做,同时存在另一个直接二分的解法。

考虑对每个点,二分能向左右延伸的最大半径,由于权值范围较大,不能O(1)查询向一侧走指定距离后到达的位置,又由于单调性,可以同时二分左右延伸的长度,如果可行考虑延长较短的一侧,否则缩短较长的一侧。

#include<cstdio>
typedef long long i64;
const int N=;
char buf[N*],*ptr=buf-;
template<class T>
T R(){
T x=;
while(*ptr<)++ptr;
while(*ptr>)x=x*+*ptr++-;
return x;
}
int n,xs[N],as[N];
i64 t,s[N][];
i64 cal(int l,int m,int r){
return
(s[r][]-s[m][])-(s[r][]-s[m][])*xs[m]-
(s[m][]-s[l-][])+(s[m][]-s[l-][])*xs[m];
}
i64 min(i64 a,i64 b){return a<b?a:b;}
int main(){
fread(buf,,sizeof(buf),stdin);
n=R<int>();
t=R<i64>()/;
for(int i=;i<=n;++i)xs[i]=R<int>();
for(int i=;i<=n;++i)as[i]=R<int>();
for(int i=;i<=n;++i){
s[i][]=s[i-][]+as[i];
s[i][]=s[i-][]+i64(as[i])*xs[i];
}
i64 ans=;
for(int i=;i<=n;++i){
int L1=,R1=i,L2=i,R2=n,M1,M2;
i64 v,cs;
while(L1<R1&&L2<R2){
M1=L1+R1>>;
M2=L2+R2+>>;
v=cal(M1,i,M2);
if(xs[i]-xs[M1]<xs[M2]-xs[i])v<=t?R1=M1:R2=M2-;
else v<=t?L2=M2:L1=M1+;
}
while(L1<R1){
M1=L1+R1>>;
v=cal(M1,i,L2);
v<=t?R1=M1:L1=M1+;
}
while(L2<R2){
M2=L2+R2+>>;
v=cal(L1,i,M2);
v<=t?L2=M2:R2=M2-;
}
v=t-cal(L1,i,L2);
cs=s[L2][]-s[L1-][];
if(L1>&&(L2==n||xs[i]-xs[L1-]<xs[L2+]-xs[i]))cs+=min(as[L1-],v/(xs[i]-xs[L1-]));
else if(L2<n)cs+=min(as[L2+],v/(xs[L2+]-xs[i]));
if(cs>ans)ans=cs;
}
printf("%lld\n",ans);
return ;
}

uoj #49. 【UR #3】铀仓库的更多相关文章

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

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

  2. 【UOJ】#49.铀仓库

    题解: 会发现实质上运一个点就是两个点之间的距离 暴力是n^2的 考虑二分距离来计算 二分完之后还要二分这个点对应的位置 nlognlogn的 考虑一种常用的思路 用一个点来更新另一个点 首先我们先二 ...

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

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

  4. UOJ #22 UR #1 外星人

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

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

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

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

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

  7. 【UOJ Round #3】

    枚举/二分 C题太神窝看不懂…… 核聚变反应强度 QwQ很容易发现次小的公约数一定是gcd的一个约数,然后……我就傻逼地去每次算出a[1],a[i]的gcd,然后枚举约数……这复杂度……哦呵呵... ...

  8. 部署docker-registry私有仓库

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

  9. 【UOJ#242】【UR#16】破坏蛋糕(计算几何)

    [UOJ#242][UR#16]破坏蛋糕(计算几何) 题面 UOJ 题解 为了方便,我们假定最后一条直线是从上往下穿过来的,比如说把它当成坐标系的\(y\)轴. 于是我们可以处理出所有交点,然后把它们 ...

随机推荐

  1. lesson9-小象学院cv

    www.sohu.com/a/159976204_717210 生成模型:基于联合概率~共生关系判别模型:基于条件概率~因果关系 生成模型之学习数据分布:1)概率密度函数估计 2)数据样本生成 模型目 ...

  2. 自定义bootbox:dialog方法

    <script src="static/ace/js/bootbox.js"></script>bootbox.dialog({ message: '< ...

  3. currentStyle&getComputedStyle获取属性

    方法如下: function getStyle(obj,attr){ if(obj.currentStyle){ return obj.currentStyle[attr]; // IE 中的方法 } ...

  4. java poi解析excel报错处理

    org.apache.xmlbeans.SchemaTypeLoaderException: XML-BEANS compiled schema: Incompatible minor version ...

  5. C语言---辗转相除法 HDU 2503

    Problem Description 给你2个分数,求他们的和,并要求和为最简形式. Input 输入首先包含一个正整数T(T < =1000),表示有T组测试数据,然后是T行数据,每行包含四 ...

  6. Java中动态获取项目根目录的绝对路径

    https://www.cnblogs.com/zhouqing/archive/2012/11/10/2757774.html 序言 在开发过程中经常会用到读写文件,其中就必然涉及路径问题.使用固定 ...

  7. 多线程线性 lock

    有时我们lock一段代码或许要根据某个变量的值,值相同则不允许有两个或以上的方法并行运行,我在工作中就遇到了,有100个值,相同的参数值不能并行运行. 还有就是一个被lock的方法递归调用会不会死锁, ...

  8. Go语言实战 (William,Kennedy 等著)

    第1章 关于Go语言的介绍 (已看) 1.1 用Go解决现代编程难题 1.1.1 开发速度 1.1.2 并发 1. goroutine 2. 通道 1.1.3 Go语言的类型系统 1. 类型简单 2. ...

  9. Navicat permium工具连接Oracle的配置

    目标数据库是Oracle11g R2 64位的 搜索很多说是需要32位的Oracle客户端,而且是要下载 Basic 版本,但是下载32位的Oracle客户端还是不行 最后把Navicat Premi ...

  10. windows可以使用curl啦(以及其他的Linux下面的指令)!

    windows可以使用cUrl了!同期放出了tar指令,去年下半年才放出来的. 介绍文章 https://blogs.technet.microsoft.com/virtualization/2017 ...