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 在幻想乡,藤原妹红是拥有不老不死能力的人类.虽然不喜欢与人们交流,妹红仍然保护着误入迷 ...
随机推荐
- 修改Listen 1源码的一点心得
注:本文只作为技术交流 首先感谢听1的作者写出这么强大的音乐播放器!! 软件首页地址:点击打开链接 软件的github上上上地址:点击打开链接 软件唯一让我美中不足的就是不能下载,这可能是作者考虑到了 ...
- 关于urllib.request解析网站不能decode
原因 不能decode,无论以gbk还utf8都无法正常解码,这个原因是因为 网页被gzip压缩了,需要解压缩 解决办法 import urllib.request import gzip url = ...
- 【每日一题】【map操作】【滑动窗口所需元素】2021年12月22日-76. 最小覆盖子串
给你一个字符串 s .一个字符串 t .返回 s 中涵盖 t 所有字符的最小子串.如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" . 注意: 对于 t 中重复字符 ...
- windows 、linux文件互传-FileZilla
1.下载免安装FileZilla并解压 2.打开.exe文件 3.点击左上角的文件->站点管理 4.点击新站点->进行配置相应的服务地址信息 5.连接上服务后,若需要将windows中的文 ...
- uniapp微信小程序返回上一页并刷新数据
根据要求:详情页返回列表页时,要刷新列表页的数据,操作如下 @click="goBack" goBack{ let pages = getCurrentPages(); // 当前 ...
- 重学c#系列——元组 [三十一]
前言 元组并不是c# 7.0的东西,早之前就有,叫做tuple.7.0加了valuetuple. 来看下元组吧,主要一些注意的地方. 正文 为什么在7.0 之前,元组用的不多呢? 因为tuple 在代 ...
- 一文告诉你AVM中设置字体的方法
avm 是一种简便的多端开发框架,可以开发APP.小程序.H5.今天学习了一下使用 avm 开发 APP 怎么设置字体,下面将经验分享给大家. 所需步骤: 1. 将需要使用的字体文件放到代码包r ...
- [OpenCV实战]14 使用OpenCV实现单目标跟踪
目录 1 背景 1.1 什么是目标跟踪 1.2 跟踪与检测 2 OpenCV的目标跟踪函数 2.1 函数调用 2.2 函数详解 2.3 综合评价 3 参考 在本教程中,我们将了解OpenCV 3中引入 ...
- Windows下Mariadb中文乱码问题
win10 在命令行使用Mariadb出现无法插入中文 并且之前正确插入的中文也无法正常显示了 ERROR 1366 (22007): Incorrect string value: '\xB1\xB ...
- mysql游标最后一行重复问题
今天用调用存储过程时发现数据有点问题,和预期不一致 经排查,发现是游标在遍历过程中重复遍历了,或者说是对游标下标的判断有Bug 调试后发现是游标使用方式不正确 应该在循环外先对游标进行一次取值操作,在 ...