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. 洛谷P1070 道路游戏(dp+优先队列优化)

    题目链接:传送门 题目大意: 有N条相连的环形道路.在1-M的时间内每条路上都会出现不同数量的金币(j时刻i工厂出现的金币数量为val[i][j]).每条路的起点处都有一个工厂,总共N个. 可以从任意 ...

  2. 一次scrapy成功停止的信息

    2017-11-05 18:52:42 [scrapy.core.engine] INFO: Closing spider (finished)2017-11-05 18:52:42 [scrapy. ...

  3. java基本数据类型的范围

    System.out.println("BYTE MAX_VALUE = " + Byte.MAX_VALUE); System.out.println("BYTE MI ...

  4. 前端tab切换 和 validatejs表单验证插件

    一.tab切换 <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...

  5. L1-009 N个数求和 (20 分)

    本题的要求很简单,就是求N个数字的和.麻烦的是,这些数字是以有理数分子/分母的形式给出的,你输出的和也必须是有理数的形式. 输入格式: 输入第一行给出一个正整数N(≤100).随后一行按格式a1/b1 ...

  6. 实验吧—密码学——WP之 杯酒人生

    首先我们研究题目 1.这是古典密码 2.喵星人要发送一段密码 3.加密过的秘钥“HTRUZYJW” 4.秘钥加密前是一个单词 我们先解决这个秘钥,用凯撒解密 而我们知道,在古典密码里,有秘钥的加密方式 ...

  7. 【递推】【HDOJ】

    http://acm.hdu.edu.cn/showproblem.php?pid=2501 Tiling_easy version Time Limit: 1000/1000 MS (Java/Ot ...

  8. 【HDOJ1598】【枚举+最小生成树】

    http://acm.hdu.edu.cn/showproblem.php?pid=1598 find the most comfortable road Time Limit: 1000/1000 ...

  9. 如何将centos7作为DNS服务器

    简单来说,dns服务器是起到缓存的作用.比如说我们第一次dig www.baidu.com的时候,dns服务器因为没有解析过百度地址,所以它需要向上一级dns服务器进行查询,然后查询结果会缓存在这台d ...

  10. linux令普通用户拥有root权限

    如题,平时我们在自己电脑上玩linux,基本都是一个root用户就够了(反正我99%时间都是直接用root用户登录系统),可如果在公司里就不行了,有时候需要多个用户对系统具有root权限,类似与一个系 ...