先不考虑修改,那么很明显即对于每一个极长的的区间,若其长度为$l$,有${l+1\choose 2}$的贡献

考虑dp去做,即$f_{i}$表示前$i$个数最大的答案,则
$$
f_{i}=\max(\max_{0\le j<i}f_{j}+{i-j+1\choose 2}-(sum_{i}-sum_{j}),f_{i-1})
$$
(其中$sum_{i}$为$a_{i}$的前缀和,即$sum_{i}=sum_{i-1}+a_{i}$)

另外,转移中允许$j$上被选择,但这显然不如直接从上一个区间左端点转移更优,因此没关系

将${i-j+1\choose 2}$展开,即
$$
f_{i}=\max({i+1\choose 2}-sum_{i}+\max_{0\le j<i}(f_{j}+{j\choose 2}+sum_{j})-ij,f_{i-1})
$$

这个与普通的斜率优化不同,维护的不是凸包(取最小值即维护凸包),具体过程如下:

这个问题可以看作$\forall 0\le j<i,y=-jx+(f_{j}+{j\choose 2}+sum_{j})$这些直线在$x=i$时的最大值

维护一个栈,插入当前直线,若当前直线与栈顶直线交点在栈顶与下一条直线交点右侧,即可弹出栈顶,最终插入当前直线

对于求$i$上的最大值,也就是二分找到单调栈中相邻两条直线交点(显然这个交点具有单调递增的性质)第一个在$x=i$右侧的位置,取这个两条直线中靠近栈顶的直线即可

另外由于$i$单调递增,二分其实并不需要,借助单调性就可以找到该位置了

由此,我们就可以$o(n)$处理出一个前缀和后缀的答案,分别记作$pre_{i}$和$suf_{i}$

对于一个询问$(x,y)$,如果不选择该位置,答案也就是$pre_{x-1}+suf_{x+1}$,如果选择该位置,枚举该位置所对应的区间,答案为
$$
\max_{x\in [l,r]}pre_{l-1}+suf_{r+1}+{r-l+2\choose 2}-(sum_{r}-sum_{l-1}+(y-a_{x}))
$$
化简后,可以发现即
$$
(pre_{l-1}+\frac{l^{2}-3l}{2}+sum_{l-1})+(suf_{r+1}+\frac{r^{2}+3r}{2}-sum_{r})-lr+(a_{x}-y+1)
$$
第一个和第二个式子分别与$l$和$r$有关,以下记为$A_{l}$和$B_{r}$,若预处理出$ans_{x}=\max_{x\in [l,r]}A_{l}+B_{r}-lr$,则询问答案即
$$
\max(ans_{x}+(a_{x}-y+1),pre_{x-1}+suf_{x+1})
$$
以下问题即求$ans_{x}$,考虑用$solve(L,R)$表示求出$\forall x\in [L,R],ans'_{x}=\max_{x\in [l,r]\subseteq [L,R]}A_{l}+B_{r}-lr$,那么所要执行的也就是$solve(1,n)$

关于$solve(L,R)$的计算显然是分治,将$[l,r]$是否跨越$mid=\lfloor\frac{L+R}{2}\rfloor$分类讨论:

1.若$[l,r]$未跨越$mid$(即$[l,r]\subseteq [L,mid]$或$[l,r]\subseteq [mid+1,R]$),递归处理,求出最大值后再与下面这种情况取max即可

2.若$[l,r]$跨越$mid$,不妨假设$x\in [L,mid]$(再另一边类似),$\forall l\in [L,mid]$去求出$r\in [mid+1,R]$的最大值,那么前缀最大之就是答案

当确定$l$后,后者也就是$A_{l}+\max_{r\in [mid+1,R]}-rl+B_{r}$,也就是若干条直线在$l$上的最大值,用与之前一样的方式用单调栈预处理即可

同样可以利用单调性做到线性,因此总复杂度即分治复杂度,为$o(n\log n)

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 300005
4 #define ll long long
5 struct line{
6 int k;
7 ll b;
8 ll get(int x){
9 return 1LL*k*x+b;
10 }
11 }st[N];
12 int n,m,x,y,a[N];
13 ll sum[N],pre[N],suf[N],A[N],B[N],c[N],ans[N];
14 double get_cross(line x,line y){
15 return -1.0*(x.b-y.b)/(x.k-y.k);
16 }
17 void add(line k){
18 while ((m>1)&&(get_cross(st[m],k)>get_cross(st[m],st[m-1])))m--;
19 st[++m]=k;
20 }
21 void solve(int l,int r){
22 if (l==r)return;
23 int mid=(l+r>>1);
24 solve(l,mid);
25 solve(mid+1,r);
26 m=0;
27 for(int i=mid+1;i<=r;i++)add(line{-i,B[i]});
28 for(int i=l,pos=m;i<=mid;i++){
29 while ((pos>1)&&(get_cross(st[pos],st[pos-1])<i))pos--;
30 c[i]=st[pos].get(i)+A[i];
31 }
32 for(int i=l;i<mid;i++)c[i+1]=max(c[i+1],c[i]);
33 m=0;
34 for(int i=l;i<=mid;i++)add(line{-i,A[i]});
35 for(int i=mid+1,pos=m;i<=r;i++){
36 while ((pos>1)&&(get_cross(st[pos],st[pos-1])<i))pos--;
37 c[i]=st[pos].get(i)+B[i];
38 }
39 for(int i=r;i>mid+1;i--)c[i-1]=max(c[i-1],c[i]);
40 for(int i=l;i<=r;i++)ans[i]=max(ans[i],c[i]);
41 }
42 int main(){
43 scanf("%d",&n);
44 for(int i=1;i<=n;i++){
45 scanf("%d",&a[i]);
46 sum[i]=sum[i-1]+a[i];
47 }
48 add(line{0,0});
49 int pos=1;
50 for(int i=1;i<=n;i++){
51 if (pos+1>=m)pos=m;
52 while ((pos>1)&&(get_cross(st[pos],st[pos-1])<i))pos--;
53 pre[i]=max(pre[i-1],st[pos].get(i)+1LL*(i+1)*i/2-sum[i]);
54 add(line{-i,pre[i]+1LL*i*(i-1)/2+sum[i]});
55 }
56 for(int i=n;i;i--)sum[i]=sum[i+1]+a[i];
57 reverse(sum+1,sum+n+1);
58 m=0,add(line{0,0}),pos=1;
59 for(int i=1;i<=n;i++){
60 if (pos+1>=m)pos=m;
61 while ((pos>1)&&(get_cross(st[pos],st[pos-1])<i))pos--;
62 suf[n-i+1]=max(suf[n-i+2],st[pos].get(i)+1LL*(i+1)*i/2-sum[i]);
63 add(line{-i,suf[n-i+1]+1LL*i*(i-1)/2+sum[i]});
64 }
65 for(int i=1;i<=n;i++)sum[i]=sum[i-1]+a[i];
66 for(int i=1;i<=n;i++)A[i]=pre[i-1]+1LL*i*(i-3)/2+sum[i-1];
67 for(int i=1;i<=n;i++)B[i]=suf[i+1]+1LL*i*(i+3)/2-sum[i];
68 for(int i=1;i<=n;i++)ans[i]=A[i]+B[i]-1LL*i*i;
69 solve(1,n);
70 scanf("%d",&m);
71 for(int i=1;i<=m;i++){
72 scanf("%d%d",&x,&y);
73 printf("%d\n",max(pre[x-1]+suf[x+1],ans[x]+(a[x]-y+1)));
74 }
75 }

[atARC066F]Contest with Drinks Hard的更多相关文章

  1. Contest with Drinks Easy

    /* Problem Statement Joisino is about to compete in the final round of a certain programming competi ...

  2. [arc066f]Contest with Drinks Hard

    题目大意: 有一些物品,每个买了有代价. 如果存在一个极大区间[l,r]内的物品都被买了,这个区间长度为k,可以获得的收益是k*(k+1)/2. 现在若干次询问,每次问假如修改了某个物品的价格,最大收 ...

  3. AtCoder Regular Contest 066 F Contest with Drinks Hard

    题意: 你现在有n个题目可以做,第i个题目需要的时间为t[i],你要选择其中的若干题目去做.不妨令choose[i]表示第i个题目做不做.定义cost=∑(i<=n)∑(i<=j<= ...

  4. 【ARC066】F - Contest with Drinks Hard

    题解 我写的斜率维护,放弃了我最擅长的叉积维护,然后发现叉积维护也不会爆long long哦-- 一写斜率维护我的代码就会莫名变长而且难写--行吧 我们看这题 推了推式子,发现这是个斜率的式子,但是斜 ...

  5. Arc066_F Contest with Drinks Hard

    传送门 题目大意 有一个长为$N$的序列$A$,你要构造一个长为$N$的$01$序列使得$01$序列全部由$1$组成的子串个数$-$两个序列的对应位置两两乘积之和最大,每次独立的询问给定$pos,x$ ...

  6. @atcoder - ARC066F@ Contest with Drinks Hard

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定序列 T1, T2, ... TN,你可以从中选择一些 Ti ...

  7. AT2274 [ARC066D] Contest with Drinks Hard

    先考虑不修改怎么做,可以令 \(dp_i\) 表示前 \(i\) 个题能获得的最大得分.那么我们有转移: \[dp_i = \min\{dp_{i - 1}, dp_{j} + \frac{(i - ...

  8. AtCoder Beginner Contest 050 ABC题

    A - Addition and Subtraction Easy Time limit : 2sec / Memory limit : 256MB Score : 100 points Proble ...

  9. 【AtCoder】ARC066

    ARC066 C - Lining Up 判断是否合法即可,合法是\(2^{\lfloor \frac{N}{2}\rfloor}\) 不合法就是0 #include <bits/stdc++. ...

随机推荐

  1. 11.4.3 LVS-TUN

    LVS-TUN 用IP隧道技术实现虚拟服务器。这种方式是在集群的节点不在同一个网段时可用的转发机制,是将IP包封装在其他网络流量中的方法。为了安全的考虑,应该使用隧道技术中的VPN,也可使用租用专线。 ...

  2. Idea热部署功能

    什么是Idea自动热部署? 热部署是指代码改动之后,调试过程中会服务自动重启,减少手动重启的麻烦,尤其是在微服务开发中,涉及到很多模块的调试更为重要. 如何开启热部署功能? 1.添加如下依赖到项目模块 ...

  3. Java8新特性——Lambda 表达式

    Lambda 表达式 ​ ​ ​ ​ ​ ​ ​ ​ Lambda 表达式的实质属于函数式编程. ​ ​ ​ ​ ​ ​ ​ ​ 语法格式为:(parameters) -> expression ...

  4. 统计学习:线性支持向量机(SVM)

    学习策略 软间隔最大化 上一章我们所定义的"线性可分支持向量机"要求训练数据是线性可分的.然而在实际中,训练数据往往包括异常值(outlier),故而常是线性不可分的.这就要求我们 ...

  5. Vulnstack内网靶场2

    环境配置 内网2靶场由三台机器构成:WIN7.2008 server.2012 server 其中2008做为对外的web机,win7作为个人主机可上网,2012作为域控 网络适配器已经设置好了不用自 ...

  6. python编写学习助手0

    项目原因 为了解决学习知识后不及时复习而导致遗忘的问题,准备写一个桌面助手,采用艾宾浩斯记忆法,对每次学习的内容排布复习计划. 第一步是做出最简单的文本列表,里面是待办事项,每个复习待办事项都会有符合 ...

  7. 【二食堂】Beta - 设计和计划

    Beta设计和计划 需求再分析 根据助教.老师.用户以及各个团队PM的反馈意见,我们的项目目前有以下问题: 功能不完整 实用价值不高 两方面的缺陷,所以在Beta阶段,我们工作的中心还是完成项目规划中 ...

  8. Alpha阶段初始任务分配

    项目 内容 这个作业属于哪个课程 2021春季软件工程(罗杰 任健) 这个作业的要求在哪里 团队项目-计划-Alpha阶段说明书 一.Alpha阶段总体规划 进行服务器相关部署 进行开发相关技术学习 ...

  9. UltraSoft - Alpha - Postmortem 事后分析

    Alpha阶段 Postmortem会议 设想和目标 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 主要是解决DDL提醒功能的问题,定义的比较清楚,对典型用户和典 ...

  10. FreeRTOS学习笔记——FreeRTOS 任务基础知识

    RTOS 系统的核心就是任务管理,FreeRTOS 也不例外,而且大多数学习RTOS 系统的工程师或者学生主要就是为了使用RTOS 的多任务处理功能,初步上手RTOS 系统首先必须掌握的也是任务的创建 ...