题目

题解

对于 \(m=1\) 这档分

我们可以 \(dp\) 然后斜率优化

具体来说就是 \(f_i = f_j + \frac{(i-j)\times (i-j+1)}{2} + sum[j]-sum[i]\)

很容易斜率优化

那么 \(m=3\times 10^5\) 时

考虑 \(cdq\) 分治

考虑 \(dp\) 出一个如上定义的前缀 \(f\) 和同理的后缀 \(g\)

设 \(h_x\) 表示强制选 \(x\) 时的最大收益,\(h_x = f_i+g_j-sum_{j-1}+sum_i+\frac{(j-i)\times(j-i-1)}{2}(i < x <j)\)

这个 \(O(n^2)\) 显然不行

记 \(F_i = f_i+\frac{i \times (i-1)}{2}+sum_i,G_i = g_i + \frac{i \times (i-1)}{2}-sum_{i-1}\)

则 \(h_x = F_i + G_j - i \times j(i < x < j)\)

对于区间 \([l,r]\),我们讨论 \([l,mid]\) 的 \(h\) 值

对于一个 \(l\le x\le mid\),它的 \(h\) 值 \(i\) 决策在它左边,\(j\) 决策 \(mid\) 右边

我们考虑对 \(j\) 决策斜率优化,\(i\) 递增,和 \(f,g\) 的算法有异曲同工之妙

然后通过一些玄学操作同理处理决策 \(i\)

最后答案就是 \(\max(f_{p-1}+g_{p+1},h_p+a_p-x)\)

\(Code\)

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#define LL long long
using namespace std; const int N = 3e5 + 5;
const LL INF = 0x3f3f3f3f3f3f3f3f;
int n, m, a[N], Q[N];
LL sum[N], f[N], g[N], F[N], G[N], h[N], w[N]; inline double slope(LL *f, int j, int k)
{
return 1.0 * ((f[j] + (1LL * j * j - j) / 2.0 + sum[j]) - (f[k] + (1LL * k * k - k) / 2.0 + sum[k])) / (j - k);
}
inline void dp(LL *f)
{
memset(f, 0, sizeof f);
int top;
Q[top = 1] = 0;
for(register int i = 1; i <= n; i++)
{
while (top > 1 && slope(f, Q[top - 1], Q[top]) < i) --top;
f[i] = max(f[i - 1], f[Q[top]] + 1LL * (i - Q[top]) * (i - Q[top] + 1) / 2 - sum[i] + sum[Q[top]]);
while (top && slope(f, Q[top - 1], Q[top]) < slope(f, Q[top], i)) --top;
Q[++top] = i;
}
} inline double slope(int j, int k){return 1.0 * (G[j] - G[k]) / (j - k);}
void divide(int l, int r, int p)
{
int mid = (l + r) >> 1, top = 0;
for(register int i = mid + 1; i <= r; i++)
{
while (top > 1 && slope(Q[top - 1], Q[top]) < slope(Q[top], i)) --top;
Q[++top] = i;
}
w[l - 1] = -INF;
for(register int i = l; i <= mid; i++)
{
while (top > 1 && slope(Q[top - 1], Q[top]) < i) --top;
w[i] = max(w[i - 1], F[i] + G[Q[top]] - 1LL * i * Q[top]);
}
if (p) for(register int i = l; i <= mid; i++) h[n - i + 1] = max(h[n - i + 1], w[i - 1]);
else for(register int i = l; i <= mid; i++) h[i] = max(h[i], w[i - 1]);
if (l ^ r) divide(l, mid, p), divide(mid + 1, r, p);
} void solve()
{
for(register int i = 1; i <= n; i++) sum[i] = sum[i - 1] + a[i];
dp(f);
reverse(a + 1, a + n + 1);
for(register int i = 1; i <= n; i++) sum[i] = sum[i - 1] + a[i];
dp(g); reverse(f + 1, f + n + 1);
for(register int i = 1; i <= n; i++) swap(f[i], g[i]);
for(register int i = 0; i <= n + 1; i++) F[i] = f[i] + 1LL * i * (i + 1) / 2 + sum[i], G[i] = g[i] + 1LL * i * (i - 1) / 2 - sum[i - 1];
for(register int i = 1; i <= n; i++) h[i] = -INF;
divide(0, n + 1, 1); for(register int i = 1; i <= n; i++) swap(f[i], g[i]);
reverse(a + 1, a + n + 1), reverse(f + 1, f + n + 1), reverse(g + 1, g + n + 1);
for(register int i = 1; i <= n; i++) sum[i] = sum[i - 1] + a[i];
for(register int i = 0; i <= n + 1; i++) F[i] = f[i] + 1LL * i * (i + 1) / 2 + sum[i], G[i] = g[i] + 1LL * i * (i - 1) / 2 - sum[i - 1];
divide(0, n + 1, 0);
} int main()
{
freopen("genocide.in", "r", stdin);
freopen("genocide.out", "w", stdout);
scanf("%d", &n);
for(register int i = 1; i <= n; i++) scanf("%d", &a[i]);
solve();
scanf("%d", &m);
for(int p, x; m; --m)
{
scanf("%d%d", &p, &x);
printf("%lld\n", max(f[p - 1] + g[p + 1], h[p] + a[p] - x));
}
}

JZOJ 5451.Genocide的更多相关文章

  1. hdu 5451 Best Solver 矩阵循环群+矩阵快速幂

    http://acm.hdu.edu.cn/showproblem.php?pid=5451 题意:给定x    求解 思路: 由斐波那契数列的两种表示方法, 之后可以转化为 线性表示 F[n] = ...

  2. (jzoj snow的追寻)线段树维护树的直径

    jzoj snow的追寻 DFS序上搞 合并暴力和,记录最长链和当前最远点,距离跑LCA # include <stdio.h> # include <stdlib.h> # ...

  3. [jzoj]3506.【NOIP2013模拟11.4A组】善良的精灵(fairy)(深度优先生成树)

    Link https://jzoj.net/senior/#main/show/3506 Description 从前有一个善良的精灵. 一天,一个年轻人B找到她并请他预言他的未来.这个精灵透过他的水 ...

  4. [jzoj]3468.【NOIP2013模拟联考7】OSU!(osu)

    Link https://jzoj.net/senior/#main/show/3468 Description osu 是一款群众喜闻乐见的休闲软件. 我们可以把osu的规则简化与改编成以下的样子: ...

  5. [jzoj]5478.【NOIP2017提高组正式赛】列队

    Link https://jzoj.net/senior/#main/show/5478 Description Sylvia 是一个热爱学习的女孩子.       前段时间,Sylvia 参加了学校 ...

  6. [jzoj]1115.【HNOI2008】GT考试

    Link https://jzoj.net/senior/#main/show/1115 Description 申准备报名参加GT考试,准考证号为n位数X1X2X3...Xn-1Xn(0<=X ...

  7. [jzoj]2538.【NOIP2009TG】Hankson 的趣味题

    Link https://jzoj.net/senior/#main/show/2538 Description Hanks 博士是BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫H ...

  8. [jzoj]4216.【NOIP2015模拟9.12】平方和

    Link https://jzoj.net/senior/#main/show/4216 Description 给出一个N个整数构成的序列,有M次操作,每次操作有一下三种: ①Insert Y X, ...

  9. [jzoj]2938.【NOIP2012模拟8.9】分割田地

    Link https://jzoj.net/senior/#main/show/2938 Description 地主某君有一块由2×n个栅格组成的土地,有k个儿子,现在地主快要终老了,要把这些土地分 ...

  10. [jzoj]2505.【NOIP2011模拟7.29】藤原妹红

    Link https://jzoj.net/senior/#main/show/2505 Description 在幻想乡,藤原妹红是拥有不老不死能力的人类.虽然不喜欢与人们交流,妹红仍然保护着误入迷 ...

随机推荐

  1. .net如何优雅的使用EFCore

    EFCore是微软官方的一款ORM框架,主要是用于实体和数据库对象之间的操作.功能非常强大,在老版本的时候叫做EF,后来.net core问世,EFCore也随之问世. 本文我们将用一个控制台项目Ho ...

  2. Java实现递归查询树结构

    我们在实际开发中,肯定会用到树结构,如部门树.菜单树等等.Java后台利用递归思路进行构建树形结构数据,返回给前端,能以下拉菜单等形式进行展示.今天,咱们就来说说怎么样将List集合转换成TreeLi ...

  3. Python3.9.5安装

    参考教程1:https://www.cnblogs.com/xiaoyanhuo/p/16362875.html 参考教程2:https://www.cnblogs.com/feng18/p/5854 ...

  4. C++日期和时间编程总结

    一,概述 二,C-style 日期和时间库 2.1,数据类型 2.2,函数 2.3,数据类型与函数关系梳理 2.4,时间类型 2.4.1,UTC 时间 2.4.2,本地时间 2.4.3,纪元时间 2. ...

  5. python模块/导入模块

    索引取值与迭代取值的差异 l1 = [1,2,3,4,5] 1.索引取值 可以任意位置任意次数的取值 不支持无序类型的数据取值 print(l1[3]) print(l1[3]) #可以直接获取任意位 ...

  6. Django中ORM多对多三种创建方式(全自动-纯手动-半自动)

    一:多对多三种创建方式 1.全自动: 利用orm自动帮我们创建第三张关系表 class Book(models.Model): name = models.CharField(max_length=3 ...

  7. 更改jenkins插件地址为国内源地址

    1.在插件管理里替换源地址 在这个界面往下拉,可看到URL地址,将其替换为:https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-ce ...

  8. .Net执行SQL/存储过程之易用轻量工具

    支持.Net/.Net Core/.Net Framework,可以部署在Docker, Windows, Linux, Mac. 由于该工具近来被广东省数个公司2B项目采用,且表现稳定,得到良好验证 ...

  9. 何为GUI???

    1.GUI是什么–简介 GUI的全称为Graphical User Interface,图形化界面或图形用户接口,是指采用图形方式显示的计算机操作环境用户接口.与早期计算机使用的命令行界面相比,图形界 ...

  10. 音乐解锁工具v1.10.3,QQ音乐,网易云,酷狗音乐格式转换工具,ncm转mp3,kgm转mp3,kgma转mp3,mgg转mp3,mflac转mp3,qmc转mp3,xm转mp3,kwm转mp3

    现在主流的听歌软件开会员听歌和下载单曲已经是两套业务了,即使开了会员下载的单曲也只能用固定的播放器进行播放,不能使用其他软件播放. 目前QQ音乐.网抑云音乐.酷狗等会员歌曲下载后都不再是传统的音频文件 ...