uoj #49. 【UR #3】铀仓库
这题二分答案可以做,同时存在另一个直接二分的解法。
考虑对每个点,二分能向左右延伸的最大半径,由于权值范围较大,不能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】铀仓库的更多相关文章
- 【UOJ#49】【UR #3】轴仓库
[UOJ#49][UR #3]轴仓库 题面 UOJ 题解 不难发现一定是每次找到离当前位置最近的一个箱子,然后把它搬过来. 那么如果我们能够确定起始位置,我们就可以二分从两侧多少距离搬箱子,判断一下时 ...
- 【UOJ】#49.铀仓库
题解: 会发现实质上运一个点就是两个点之间的距离 暴力是n^2的 考虑二分距离来计算 二分完之后还要二分这个点对应的位置 nlognlogn的 考虑一种常用的思路 用一个点来更新另一个点 首先我们先二 ...
- 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排列连出来的路径 ...
- 【UOJ Round #3】
枚举/二分 C题太神窝看不懂…… 核聚变反应强度 QwQ很容易发现次小的公约数一定是gcd的一个约数,然后……我就傻逼地去每次算出a[1],a[i]的gcd,然后枚举约数……这复杂度……哦呵呵... ...
- 部署docker-registry私有仓库
部署docker-registry私有仓库 创建文件夹 sudo mkdir -p /var/docker-data/{registry,certs,auth} sudo openssl req ...
- 【UOJ#242】【UR#16】破坏蛋糕(计算几何)
[UOJ#242][UR#16]破坏蛋糕(计算几何) 题面 UOJ 题解 为了方便,我们假定最后一条直线是从上往下穿过来的,比如说把它当成坐标系的\(y\)轴. 于是我们可以处理出所有交点,然后把它们 ...
随机推荐
- Gym.102059: 2018-2019 XIX Open Cup, Grand Prix of Korea(寒假gym自训第一场)
整体来说,这一场的质量比较高,但是题意也有些难懂. E.Electronic Circuit 题意: 给你N个点,M根线,问它是否是一个合法的电路. 思路: 一个合法的电路,经过一些串联并联关系, ...
- 第三次随笔--安装虚拟机及学习linux系统初体验
第三次随笔--安装虚拟机及学习linux系统初体验 ·学习基于VirtualBox虚拟机安装Ubuntu图文教程在自己笔记本上安装Linux操作系统 首先按照老师的提示步骤进行VirtualBox虚拟 ...
- 使用w uptime vmstat top sar nload 等命令查看系统负载
1. w 和uptime,查看cpu的使用率: 2.vmstat 命令,查看更细的物理设备使用状况: 3.top 命令: top -c 可具体查看命令及路径: top -bn1 静太显示一条命令, ...
- java-多态中成员访问特点-父类引用指向子类对象
多态前提: - 要有继承关系. - 要有方法重写. - 要有父类引用指向子类对象. 1.成员变量:编译看左边(父类),运行看左边(父类) 2.成员方法:编译看左边(父类),运行看右边(子类),动态绑定 ...
- eclipse + python + pydev
工具:eclipse-nion.jdk8.python3.6.pydev eclipse -> help -> eclipse marketplace -> 输入 python,in ...
- 2018.4.23 git删除已经add的文件
使用 git rm 命令即可,有两种选择, 一种是 git rm --cached "文件路径",不删除物理文件,仅将该文件从缓存中删除: 一种是 git rm --f " ...
- Python学习之---Python中的内置函数(方法)(更新中。。。)
add(item) #将item添加到s中,如果item已经在s中,则无任何效果 break #退出循环,不会再运行循环中余下的代码 bool() #将参数转换为布尔型 by ...
- laravel使用过程中一些总结
推荐连接: laravel辅助函数总结:https://laravel-china.org/docs/laravel/5.5/helpers 基于 Laravel 集成的 Monolog 库对日志进行 ...
- How tbb proxy works
- django 保存中文到mysql 报错django.db.utils.DatabaseError: Incorrect string value: '\xE5\xBE\x88\xE7\x81\xB5
分析: 1.尝试在Python中对数据转码成utf8,'中文'.encode("utf-8"),还是报错 2.观察堆栈发现应该是操作mysql数据库的时候,将数据插入表里出错 所以 ...