2018牛客网暑期ACM多校训练营(第二场)G Transform(二分)
题意
在一个数轴上有n个集装箱,第 i 个集装箱的位置为x[i],且在集装箱内装有a[i]件货物,现在将这些集装箱内的货物进行移动(将一件货物从第 i 个集装箱移动到第 j 个集装箱的花费就为2*abs(x[i]-x[j]) ),求在总花费不超过T的情况下,最多能将多少货物移动到同一个集装箱内。
分析
既然要使得花费在不超过T的情况尽可能多的移动货物,那么我们肯定是将一个区间内的所有货物移到坐标中位的集装箱上。那么我们就可以对答案进行二分,然后枚举所要移动的区间的左端点,再找到中位点和右端点,然后判断这个区间移动的花费是否小于T。
可以预处理一下前缀和以及前缀花费、距离等。依次来计算区间的花费。
二分判断的过程中,由于最终的答案不一定是将整个区间内所有的货物都移动到一个集装箱,所以我们还要判断比需求量多的那部分是从左端点移过来的还剩从右端点移过来的,然后再根据花费的大小情况进行二分就可以得到最终答案了。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<string>
#include<cstring>
using namespace std;
#define ll long long
const int N = 5e5 + ;
ll dis[N]; ///dis[i]表示第i个集装箱距离x=0的距离
ll num[N]; ///num[i]表示第i个集装箱有的产品个数
ll sum[N]; ///sum[i]表示第1~i个集装箱有的产品数总和
ll cost[N]; ///cost[i]表示第1~i个集装箱的所有产品移到x=0处所"获得"的费用
ll tot,q;
int n, L, R, u; ///u为产品汇总的最优点
ll cost_l(int i) {///费用=将L+1~i中所有产品移动到i处所需费用+(将i~R中所有的产品移动到i处所需的费用 - 区间L+1~R比x多的产品数从R处移动到i处的费用)
return ((sum[i] - sum[L])*dis[i] - (cost[i] - cost[L])) + ((cost[R] - cost[i]) - (sum[R] - sum[i])*dis[i] - (sum[R] - sum[L] - q)*(dis[R] - dis[i]));
}
ll cost_r(int i) {///同上,只是规则是优先从右边界开始取产品
return -((sum[R] - sum[i])*dis[i] - (cost[R] - cost[i])) - ((cost[i-] - cost[L]) - (sum[i-] - sum[L])*dis[i] + (sum[R] - sum[L] - q)*(dis[i] - dis[L+]));
}
bool check(ll &x) { ///判断需求x是否能在所给的费用t内达到
q = x;
L = , R = , u = ;
while () { ///从左边界开始向右移动区间,优先取区间左边的产品
while (R < n&&sum[R] - sum[L] < x) R++;
if (sum[R] - sum[L] < x)break; ///若是当前的L~n无法满足x,那么L++也不可能满足
while (u < L)u++;
while (u < R&&cost_l(u)>cost_l(u + ))u++;
if (cost_l(u) <= tot)return true;
L++;
}
L = n - , R = n, u = n;
while () { ///从右边界开始向左移动区间,优先取区间右边的产品
while (L > && sum[R] - sum[L] < x) L--;
if (sum[R] - sum[L] < x)break; ///若是当前的L~R无法满足x,那么R--也不可能满足
while (u > R)u--;
while (u > L && cost_r(u) > cost_r(u - ))u--;
if (cost_r(u) <= tot)return true;
R--;
}
return false;
}
int main()
{
scanf("%d%lld", &n, &tot);
tot /= ;
for (int i = ; i <= n; i++)
scanf("%lld", &dis[i]);
sum[]=cost[]=;
for (int i = ; i <= n; i++) {
scanf("%lld", &num[i]);
sum[i] = sum[i - ] + num[i];
cost[i] = cost[i - ] + num[i] * dis[i];
}
ll l = ,r = sum[n] + ;
while (l + < r) {
ll mid = (l + r) >> ;
if (check(mid)) l = mid;
else r = mid;
}
printf("%lld\n", l);
return ;
}
2018牛客网暑期ACM多校训练营(第二场)G Transform(二分)的更多相关文章
- 2018牛客网暑期ACM多校训练营(第二场)I- car ( 思维)
2018牛客网暑期ACM多校训练营(第二场)I- car 链接:https://ac.nowcoder.com/acm/contest/140/I来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 ...
- 2018牛客网暑期ACM多校训练营(第一场)D图同构,J
链接:https://www.nowcoder.com/acm/contest/139/D来源:牛客网 同构图:假设G=(V,E)和G1=(V1,E1)是两个图,如果存在一个双射m:V→V1,使得对所 ...
- 2018 牛客网暑期ACM多校训练营(第一场) E Removal (DP)
Removal 链接:https://ac.nowcoder.com/acm/contest/139/E来源:牛客网 题目描述 Bobo has a sequence of integers s1, ...
- 2018牛客网暑期ACM多校训练营(第十场)A Rikka with Lowbit (树状数组)
链接:https://ac.nowcoder.com/acm/contest/148/A 来源:牛客网 Rikka with Lowbit 时间限制:C/C++ 5秒,其他语言10秒 空间限制:C/C ...
- 2018牛客网暑期ACM多校训练营(第十场)J Rikka with Nickname(二分,字符串)
链接:https://ac.nowcoder.com/acm/contest/148/J?&headNav=acm 来源:牛客网 Rikka with Nickname 时间限制:C/C++ ...
- 2018牛客网暑期ACM多校训练营(第二场)J Farm(树状数组)
题意 n*m的农场有若干种不同种类作物,如果作物接受了不同种类的肥料就会枯萎.现在进行t次施肥,每次对一个矩形区域施某种类的肥料.问最后枯萎的作物是多少. 分析 作者:xseventh链接:https ...
- 2018牛客网暑期ACM多校训练营(第一场)B Symmetric Matrix(思维+数列递推)
题意 给出一个矩阵,矩阵每行的和必须为2,且是一个主对称矩阵.问你大小为n的这样的合法矩阵有多少个. 分析 作者:美食不可负064链接:https://www.nowcoder.com/discuss ...
- 2018牛客网暑期ACM多校训练营(第三场) A - PACM Team - [四维01背包][四约束01背包]
题目链接:https://www.nowcoder.com/acm/contest/141/A 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K ...
- 2018牛客网暑期ACM多校训练营(第五场) F - take - [数学期望][树状数组]
题目链接:https://www.nowcoder.com/acm/contest/143/F 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K ...
- 2018牛客网暑期ACM多校训练营(第五场) E - room - [最小费用最大流模板题]
题目链接:https://www.nowcoder.com/acm/contest/143/E 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K ...
随机推荐
- MT【302】利用值域宽度求范围
已知$f(x)=\ln x+ax+b (a>0)$在区间$[t,t+2],(t>0)$上的最大值为$M_t(a,b)$.若$\{b|M_t(a,b)\ge\ln2 +a\}=R$,则实数$ ...
- 写个shell脚本依次运行每个程序半小时
@echo off :: 运行时间1800000毫秒 echo wscript.sleep 1800000 >run.vbs ::运行Debug/lab1.exe程序,后面是参数 start D ...
- Nagios 使用 NSClient++ 监控Windows Server
在被监控的Windows server 主机上安装NSClinet++下载地址:https://www.nsclient.org/download/32bit:http://files.nsclien ...
- Min_25
可以用来筛出一个积性函数的前缀和.这个积性函数要满足当\(x\)是质数时,\(f(x)\)可以快速求出,\(f(x^k)\)也可以快速算出. 首先我们要处理出一个\(g(x)=\sum_{x\in p ...
- 【BZOJ4316】小C的独立集(动态规划)
[BZOJ4316]小C的独立集(动态规划) 题面 BZOJ 题解 考虑树的独立集求法 设\(f[i][0/1]\)表示\(i\)这个点一定不选,以及\(i\)这个点无所谓的最大值 转移\(f[u][ ...
- 学习1__STM32--FatFS之逻辑盘符与物理盘符
FatFS源代码中的函数逻辑关系 第一 调用函数 f_mount() result = f_mount(&fs, FS_VOLUME_NAND, ); /* Mount a logical d ...
- pycharm 中的 全局搜索(ctrl+shift+f) 功能无法使用的原因
全局搜索的时候Ctrl+Shift+F按键失灵,有的时候可以,有时又不行了,百思不得其解. 在網上搜索很多人說是搜狗输入法的快捷键冲突了,但是我的电脑用的是微软自带的输入法 后来打开微软的输入法设置发 ...
- #1014 : Trie树 HihoCoder(字典树)
描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进. 这一天,他们遇到了一本词典,于是小Hi就向小Ho提出了那个经典的问题: ...
- P1886 P2216 单调队列模板
何为单调队列? 单调队列是一个队列(废话) 而且必须同时满足下标单调和值单调两个单调特性. 跟优先队列不同,优先队列直接使用堆(heap)来实现,如何删去特定下标元素?不明. 本人喜欢用单调队列存下标 ...
- 洛谷P1196 银河英雄传说
大意:你有30000个队列,第i个队列中只有i 有T个操作,1,把某个队列头接到另一个队列尾. 2,问两个元素之间的距离. 本题主要有三种解法. ①带权并查集. 具体来说就是,并查集维护当前集合的大小 ...