Atcoder Regular Contest 066 F genocide【JZOJ5451】
题目
分析
\(s[i]\)表示a前缀和。
设\(f[i]\)表示做完了1~i的友谊颗粒的最优值(不一定选i),那么转移方程为
类似的,设$g_i$表示做完了i~n的友谊颗粒的最优值(不一定选i),
将a翻转,像f一样做一遍,再将g翻转就可以了。
对于询问(p,x),如果我们不选择p,那么答案就是$f[i-1]+g[i+1]$
如果我们选择了p,我们再设$F[i]$表示,必选i的最优值。
$$F[i]=max\{f[j]+g[k]+\dfrac{(k-j+1)(k-j+2)}{2}\}(j<i<k)\]
时间复杂度是\(O(N^2)\)
如何可以更快的求出\(F[i]\)呢,
分治,假设当前做到\([l,r]\),左端点\([l,mid]\),i和右端点在\([mid+1,r]\)
\(tmp[i]\)表示做完了左端点~i的友谊颗粒,且必选i的最优值
我们将\([l-1,mid-1]\)的端点扔进斜率优化的单调栈,扫一遍\([mid+1,r]\)求出tmp,
\]
那么\(F[i]\)就是当前区间\(tmp[i]\)的后缀max
因为只考虑了i在\([mid+1,r]\)的情况,反过来做一遍就可以了。
那么选择了p的的最优值就是\(F[p]+a[p]-x\)
#include <iostream>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <map>
#include <queue>
#include <stack>
using namespace std;
const int maxlongint=2147483647;
const int mo=1e9+7;
const int N=1000005;
#define rev(h) for(int i=1;i<=n/2;i++) swap(h[i],h[n-i+1])
#define val(h,j,k) 1ll*(h[j]-h[k]+s[j]-s[k]-1ll*j*1.0/2+1ll*k*1.0/2+1ll*j*j*1.0/2-1ll*k*k*1.0/2)*1.0/(j-k)
int n,m,t[N],top;
long long a[N],s[N],f[N],g[N],F[N],tmp[N];
void dg(long long *f,long long *g,int l,int r)
{
if(l==r)
{
F[l]=max(F[l],f[l-1]+g[l+1]+1-a[l]);
return;
}
int mid=(l+r)>>1;
top=0;
for(int i=l-1;i<=mid;i++)
{
for(;top>1 && val(f,i,t[top])>=val(f,t[top],t[top-1]);) top--;
t[++top]=i;
}
for(int i=mid+1;i<=r;i++)
{
for(;top>1 && val(f,t[top],t[top-1])<=i;) top--;
int j=t[top];
tmp[i]=f[j]-(s[i]-s[j])+1ll*(i-j)*(i-j+1)/2+g[i+1];
}
for(int i=r-1;i>=mid+1;i--) tmp[i]=max(tmp[i],tmp[i+1]);
for(int i=r;i>=mid+1;i--) F[i]=max(F[i],tmp[i]);
dg(f,g,l,mid),dg(f,g,mid+1,r);
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%lld",&a[i]),s[i]=s[i-1]+a[i],F[i]=-a[i]+1;
t[top=1]=0;
for(int i=1;i<=n;i++)
{
for(;top>1 && val(f,t[top],t[top-1])<=i;) top--;
int j=t[top];
f[i]=max(f[j]-(s[i]-s[j])+1ll*(i-j)*(i-j+1)/2,f[i-1]);
for(;top>1 && val(f,i,t[top])>=val(f,t[top],t[top-1]);) top--;
t[++top]=i;
}
rev(a);
t[top=1]=0;
for(int i=1;i<=n;i++) s[i]=s[i-1]+a[i];
for(int i=1;i<=n;i++)
{
for(;top>1 && val(g,t[top],t[top-1])<=i;) top--;
int j=t[top];
g[i]=max(g[j]-(s[i]-s[j])+1ll*(i-j)*(i-j+1)/2,g[i-1]);
for(;top>1 && val(g,i,t[top])>=val(g,t[top],t[top-1]);) top--;
t[++top]=i;
}
rev(a);
for(int i=1;i<=n;i++) s[i]=s[i-1]+a[i];
rev(g);
dg(f,g,1,n);
rev(a);
rev(g);
for(int i=1;i<=n;i++) s[i]=s[i-1]+a[i];
rev(F);
rev(f);
dg(g,f,1,n);
rev(F);
rev(g);
rev(f);
rev(a);
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
long long p,x;
scanf("%lld%lld",&p,&x);
printf("%lld\n",max(f[p-1]+g[p+1],F[p]+a[p]-x));
}
}
Atcoder Regular Contest 066 F genocide【JZOJ5451】的更多相关文章
- AtCoder Regular Contest 085 C HSI【概率论】
AtCoder Regular Contest 085 C HSI 没学概率论还不怎么看得懂,虽然感觉不难,其实明明可以猜出来的..... 参考博客:https://www.cnblogs.com/g ...
- AtCoder Regular Contest 066 F Contest with Drinks Hard
题意: 你现在有n个题目可以做,第i个题目需要的时间为t[i],你要选择其中的若干题目去做.不妨令choose[i]表示第i个题目做不做.定义cost=∑(i<=n)∑(i<=j<= ...
- AtCoder Regular Contest 069 F Flags 二分,2-sat,线段树优化建图
AtCoder Regular Contest 069 F Flags 二分,2-sat,线段树优化建图 链接 AtCoder 大意 在数轴上放上n个点,点i可能的位置有\(x_i\)或者\(y_i\ ...
- AtCoder Beginner Contest 137 D题【贪心】
[题意]一共有N个任务和M天,一个人一天只能做一个任务,做完任务之后可以在这一天之后的(Ai-1)天拿到Bi的工资,问M天内最多可以拿到多少工资. 链接:https://atcoder.jp/cont ...
- 【AtCoder Regular Contest 082 F】Sandglass
[链接]点击打开链接 [题意] 你有一个沙漏. 沙漏里面总共有X单位的沙子. 沙漏分A,B上下两个部分. 沙漏从上半部分漏沙子到下半部分. 每个时间单位漏1单位的沙子. 一开始A部分在上面.然后在r1 ...
- 【推导】【模拟】AtCoder Regular Contest 082 F - Sandglass
题意:有个沙漏,一开始bulb A在上,bulb B在下,A内有a数量的沙子,每一秒会向下掉落1.然后在K个时间点ri,会将沙漏倒置.然后又有m个询问,每次给a一个赋值ai,然后询问你在ti时刻,bu ...
- 【arc077f】AtCoder Regular Contest 077 F - SS
题意 给你一个形如"SS"的串S,以及一个函数\(f(x)\),\(x\)是一个形如"SS"的字符串,\(f(x)\)也是一个形如"SS"的 ...
- 【构造】AtCoder Regular Contest 079 F - Namori Grundy
对每个点的取值都取最小的可能值. 那个图最多一个环,非环的点的取值很容易唯一确定. 对于环上的点v,其最小可能取值要么是mex{c1,c2,...,ck}(ci这些是v直接相连的非环点)(mex是). ...
- 【AtCoder Regular Contest 076 F】Exhausted (贪心)
Description 机房里有M台电脑排成一排,第i台电脑的坐标是正整数i. 现在有N个OIer进入了机房,每个OIer需要一台电脑来学tui习ji,同时每个OIer对自己电脑所处的坐标范围有一个要 ...
随机推荐
- Partition to K Equal Sum Subsets
Given an array of integers nums and a positive integer k, find whether it's possible to divide this ...
- 创建Maven Web项目时很慢解决办法
点击加号,Name输入archetypeCatalog,Value输入internal archetypeCatalog表示插件使用的archetype元数据,不加这个参数时默认为remote,loc ...
- [Luogu5686] 和积和
Description 给定两个下标从\(1\)到\(n\)编号的序列 \(a_i,b_i\),定义函数\(S(l,r)(1\le l\le r\le n)\)为: \[\sum_{i=l}^r a_ ...
- js执行多次事件,而非一次
晚上查阅了很多文章,都是避免点击事件多次执行.反过来要是让事件多次执行该如何做? 这里可以配个setTimeout():来执行 这里我们用layui <link rel="styles ...
- thinkPHP验证码报错: Call to undefined function captcha_src()
问题出现的原因可能有: 1. captcha扩展缺失: 2. captcha扩展与当前thinkPHP版本不兼容. thinkPHP6.0以下版本只能使用 captcha2.0以下版本,不支持2.0版 ...
- pycharm 快捷键练习 和基本英语单词练习
通过练习 一下快捷键 打代码的速度得到提升 pycharm以下 快捷键+快捷键意义 ctrl+a 全选 ctrl+c 复制(不选中默认复制一行) ctrl+v 粘贴 ctrl+x 剪切 ctrl+f ...
- GoAccess操作手册
名字 GoAccess - 可视化 Web 日志分析工具. 语法 goaccess [filename] [ options ... ] [-c][-M][-H][-q][-d][...] 描述 Go ...
- node工具之node-ip
node-ip node.js用来获取id地址的工具 use var ip = require('ip'); ip.address() // my ip address ip.isEqual('::1 ...
- Vue2.X 通过 ajax 获取 API 数据(非 axios)
不多废话,笔记如下 1. javascript: let vm = new Vue({ el: '#card-text', data: { info: '' }, beforeCreate: func ...
- JAVA网络编程入门
JAVA网络编程入门 软件结构 C/S结构 B/S结构 无论哪一种结构,都离不开网络的支持.网络编程,就是在网络的条件下实现机器间的通信的过程 网络通信协议 网络通信协议:通信双方必须同时遵守才能完成 ...