BZOJ3461 : Jry的时间表
fl[i]表示[1,i]操作一次,且在[j+1,i]处操作的最大值
1:把[j+1,i]改为b[i]:
max(sum[j]+b[i]*(i-j))
=b[i]*i+max(-j*b[i]+sum[j])(0<=j<i)
由于j递增,-j递减,所以从右往左建立凸壳,查询时在凸壳上二分查找即可,时间复杂度$O(n\log n)$。
2:把[j+1,i]改为b[j]:
max(sum[j]+b[j+1]*(i-j))
=max(b[j+1]*i+sum[j]-b[j+1]*j)(0<=j<i)
考虑分治,对[l,mid]按b[j+1]从小到大排序,然后斜率优化即可,时间复杂度$O(n\log^2n)$。
将a,b序列翻转,即可求出fr[i]。
ans=max(fl[i]-sum[i]+fr[j]+sum[j-1])(0<=i<j<=n)
=max(fr[j]+sum[j-1]+max(fl[i]-sum[i]))
维护前缀最大的fl[i]-sum[i]即可。
#include<cstdio>
#include<algorithm>
#define N 500010
typedef long long ll;
int n,i,j,a[N],b[N],c[N],e[N],q[N],h,t;ll sum[N],d[N],f[N],fl[N],fr[N],pre,ans;
inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
inline double pos(int x,int y){return (double)(sum[x]-sum[y])/(double)(x-y);}
inline ll ask(int x){
int l=1,r=t-1,fin=t,mid;
while(l<=r){
mid=(l+r)>>1;
if((double)x>pos(q[mid],q[mid+1]))r=(fin=mid)-1;else l=mid+1;
}
return sum[q[fin]]-(ll)q[fin]*x;
}
inline void up(ll&x,ll y){if(x<y)x=y;}
inline bool cmp(int x,int y){return c[x]==c[y]?d[x]>d[y]:c[x]<c[y];}
inline double slope(int x,int y){return (double)(d[x]-d[y])/(double)(c[y]-c[x]);}
void solve(int l,int r){
if(l==r)return;
int mid=(l+r)>>1;
solve(l,mid),solve(mid+1,r);
for(j=0,i=l;i<=mid;i++)e[j++]=i;
for(std::sort(e,e+j,cmp),t=i=0,h=1;i<j;i++){
if(i&&c[e[i]]==c[e[i-1]])continue;
while(t>1&&slope(q[t-1],q[t])>=slope(q[t],e[i]))t--;
q[++t]=e[i];
}
for(i=mid+1;i<=r;i++){
while(h<t&&(d[q[h]]-d[q[h+1]])<=(ll)i*(c[q[h+1]]-c[q[h]]))h++;
up(f[i],(ll)c[q[h]]*i+d[q[h]]);
}
}
void work(){
for(i=1;i<=n;i++)sum[i]=sum[i-1]+a[i];
for(t=i=0;i<=n;q[++t]=i++){
if(i)f[i]=(ll)b[i]*i+ask(b[i]);
while(t>1&&pos(i,q[t])>pos(q[t],q[t-1]))t--;
}
for(i=0;i<n;i++)c[i]=b[i+1],d[i]=sum[i]-(ll)b[i+1]*i;
solve(0,n);
}
int main(){
for(read(n),i=1;i<=n;i++)read(a[i]);
for(i=1;i<=n;i++)read(b[i]);
work();
for(i=1;i<=n;i++)fl[i]=f[i];
for(i=1,j=n;i<j;i++,j--)t=a[i],a[i]=a[j],a[j]=t,t=b[i],b[i]=b[j],b[j]=t;
work();
for(i=1;i<=n;i++)fr[n-i+1]=f[i];
for(i=1;i<=n;i++)sum[i]=sum[i-1]+a[n-i+1];
for(ans=sum[n],i=1;i<=n;i++){
up(ans,fr[i]+sum[i-1]+pre);
up(pre,fl[i]-sum[i]);
}
return printf("%lld",ans),0;
}
BZOJ3461 : Jry的时间表的更多相关文章
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- .NET Core RC2/RTM 明确了时间表
.NET Core 经过了将近2年的开发,去年12月份发布的RC1版本,明确来说那只是一个beta版本,自从RC1发布以来,看到github里的RC2分支,整个工具链都发生了很大的变化,大家都在焦急的 ...
- [No0000A1]人体排毒时间表,别再信了
经常可以看到有「人体排毒时间表」这样的说法,不同的媒体反复传播,大同小异.这些说法里,大多把人体的系统器官都给安排了一个特定的时段,认为在某时段是某器官的排毒时间,睡觉能排一切毒.事实上果真如此么?让 ...
- 【三石jQuery视频教程】03.创建垂直时间表(Timeline)
视频地址:http://v.qq.com/page/g/i/o/g0150rvi6io.html 大家好,欢迎来到[三石jQuery视频教程],我是您的老朋友 - 三生石上. 今天,我们要通过基本的H ...
- Bootstrap日期和时间表单组件运用兼容ie8
准备动作先到下载Bootstrap日期和时间组件. 1:引入bootstrap.min.css,因为bootstrap-datetimepicker里面的很多样式依赖bootstarp的主样式,字体文 ...
- Java发展的时间表
Java发展的时间表. (版本号 名称 中文名 发布日期) JDK 1.1.4 Sparkler 宝石 1997-09-12 JDK 1.1.5 Pumpkin 南瓜 1997-12-13 JDK 1 ...
- 这是一篇关于:以时间表的形式来介绍Java如何演变至今,以及Java版本的一些特性的分享
这是一篇关于:以时间表的形式来介绍Java如何演变至今,以及Java版本的一些特性的分享: Java版本,功能和历史 原文[英]:https://javapapers.com/core-java/ja ...
- input时间表单默认样式修改(input[type="date"])
一.时间选择的种类: HTML代码:选择日期:<input type="date" value="2018-11-15" /> 选择时间:<i ...
- HttpWatch HttpWatch时间表(HttpWatch Time Charts)
HttpWatch时间表(HttpWatch Time Charts) by:授客 QQ:1033553122 截图 说明 页面事件线(Page Event Lines)
随机推荐
- 开机提示grub可咋办啊
导读 GRUB是多启动规范的实现,它允许用户可以在计算机内同时拥有多个操作系统,并在计算机启动时选择希望运行的操作系统.GRUB可用于选择操作系统分区上的不同内核,也可用于向这些内核传递启动参数. 1 ...
- [BZOJ2423][HAOI2010]最长公共子序列
[BZOJ2423][HAOI2010]最长公共子序列 试题描述 字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列.令给定的字符序列X=“x ...
- WPF 路由事件总结
1.什么是路由事件 已下为MSDN中的定义 功能定义:路由事件是一种可以针对元素树中的多个侦听器(而不是仅针对引发该事件的对象)调用处理程序的事件. 实现定义:路由事件是一个 CLR 事件,可以由 R ...
- Bellman-Ford算法
#include<stdio.h> #define max 0xffffff ][]; //图的邻接矩阵 ]; int n;//顶点个数 int m;//边个数 struct Edge { ...
- 把sql server 2000的用户表的所有者改成dbo
怎么样把sql server 2000的用户表的所有者,改成dbo,而不是用户名. 推荐使用下面介绍的第二种方法,执行以下查询便可以了.sp_configure 'allow updates','1' ...
- 【Django】Django 如何支持 分组查询、统计?
代码: from django.db.models import Sum alarm_sum_group_items = models.FILE_PROTECT_ALARM.objects.filte ...
- js:判断对象是否为空
var list = []; var param = {}; ....... var hasProp = false; for (var prop in param){ hasProp = true; ...
- 【转】javax.net.ssl.SSLHandshakeException(Cas导入证书)
本文转自:http://my.oschina.net/laiwanshan/blog/159057 一.报错: javax.net.ssl.SSLHandshakeException 二.原因分析:C ...
- Java与数据库类型对照表
数据库类型 Java类型 INTEGER int or java.lang.Integer BIGINT long or java.lang.Long SMALLINT short o ...
- [Android Pro] AndroidStudio导出jar包
reference : http://blog.csdn.net/beijingshi1/article/details/38681281 不像在Eclipse,可以直接导出jar包.Android ...