JZOJ 5451.Genocide
题目

题解
对于 \(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的更多相关文章
- hdu 5451 Best Solver 矩阵循环群+矩阵快速幂
http://acm.hdu.edu.cn/showproblem.php?pid=5451 题意:给定x 求解 思路: 由斐波那契数列的两种表示方法, 之后可以转化为 线性表示 F[n] = ...
- (jzoj snow的追寻)线段树维护树的直径
jzoj snow的追寻 DFS序上搞 合并暴力和,记录最长链和当前最远点,距离跑LCA # include <stdio.h> # include <stdlib.h> # ...
- [jzoj]3506.【NOIP2013模拟11.4A组】善良的精灵(fairy)(深度优先生成树)
Link https://jzoj.net/senior/#main/show/3506 Description 从前有一个善良的精灵. 一天,一个年轻人B找到她并请他预言他的未来.这个精灵透过他的水 ...
- [jzoj]3468.【NOIP2013模拟联考7】OSU!(osu)
Link https://jzoj.net/senior/#main/show/3468 Description osu 是一款群众喜闻乐见的休闲软件. 我们可以把osu的规则简化与改编成以下的样子: ...
- [jzoj]5478.【NOIP2017提高组正式赛】列队
Link https://jzoj.net/senior/#main/show/5478 Description Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校 ...
- [jzoj]1115.【HNOI2008】GT考试
Link https://jzoj.net/senior/#main/show/1115 Description 申准备报名参加GT考试,准考证号为n位数X1X2X3...Xn-1Xn(0<=X ...
- [jzoj]2538.【NOIP2009TG】Hankson 的趣味题
Link https://jzoj.net/senior/#main/show/2538 Description Hanks 博士是BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫H ...
- [jzoj]4216.【NOIP2015模拟9.12】平方和
Link https://jzoj.net/senior/#main/show/4216 Description 给出一个N个整数构成的序列,有M次操作,每次操作有一下三种: ①Insert Y X, ...
- [jzoj]2938.【NOIP2012模拟8.9】分割田地
Link https://jzoj.net/senior/#main/show/2938 Description 地主某君有一块由2×n个栅格组成的土地,有k个儿子,现在地主快要终老了,要把这些土地分 ...
- [jzoj]2505.【NOIP2011模拟7.29】藤原妹红
Link https://jzoj.net/senior/#main/show/2505 Description 在幻想乡,藤原妹红是拥有不老不死能力的人类.虽然不喜欢与人们交流,妹红仍然保护着误入迷 ...
随机推荐
- 深入浅出学习透析Nginx服务器的基本原理和配置指南「Keepalive性能分析实战篇」
Linux系统:Centos 7 x64 Nginx版本:1.11.5 Nginx 是一款面向性能设计的 HTTP 服务器,能反向代理 HTTP,HTTPS 和邮件相关(SMTP,POP3,IMAP) ...
- c++学习笔记(入门)
1 struct和class的区别 struct成员变量(成员函数)的访问属性缺省的情况下默认为public. class成员变量(成员函数)的访问属性缺省的情况下默认为private. 2 初始化列 ...
- 数电第7周周结_by_yc
一.通用双向移位寄存器: 功能描述: 4位的双向移位寄存器,含控制输入端(ctrl).串行输入端(Dsl.Dsr).4个并行输入端和4个并行输出端,要求实现5种功能:异步置零.同步置数.左移.右移 ...
- 宝塔渗透之msf代理入侵
前言 在渗透中遇到内网主机是一层接一层的拓扑形式,可以采用多层代理加路由转发访问,便于在渗透中出现网段隔绝可以使用此方法跳出局限 实验环境 kali: 192.168.75.131 target-ce ...
- [深度学习] imgaug库使用笔记
imgaug是一款非常有用的python图像增强库,非常值得推荐应用于深度学习图像增强.其包含许多增强技术,支持图像分类,目标检测,语义分割,热图.关键点检测等一系列任务的图像增强.本文主要介绍img ...
- [深度学习] fast-reid入门教程
fast-reid入门教程 ReID,全拼为Re-identification,目的是利用各种智能算法在图像数据库中找到与要搜索的目标相似的对象.ReID是图像检索的一个子任务,本质上是图像检索而不是 ...
- SSM框架——整合ssm
SSM整合 1.准备工作 新建一个普通的Maven项目 建好所有需要的架构层 向pom.xml中导入所有的依赖 <!--MyBatis相关--> <dependency> &l ...
- Java基础篇——注解和反射
注解 注解Annotation可以被其他程序(编译器)读取,常见的有@override 内置注解 @Override 适用于修饰方法,表明重写父类中的一个方法 @Deprecated 用于修饰类.方法 ...
- 【深入浅出 Yarn 架构与实现】4-4 RM 管理 Application
在 YARN 中,Application 是指应用程序,它可能启动多个运行实例,每个运行实例由 -个 ApplicationMaster 与一组该 ApplicationMaster 启动的任务组成, ...
- 一个小而美的 C 语言项目
我最近在学习 C 语言,看的一本书叫做 <C Primer Plus>,这本书对 C 语言的描写.特性介绍.代码示例都介绍的比较详细,是小白入门 C 语言非常不错的一本书,还有一本经典书叫 ...