NOIP 模拟赛 左右横跳
\(\text{Problem}\)
大意就是优化这样一个 \(dp\)
\]
\(L[i] \le j < i,n\le 5 \times 10^6\)
\(L[i]\) 给出且满足 \(L[x] \le L[x+1]\)
\(\text{Solution}\)
本做法经大佬指点
\(O(n \log n)\) 时限有 \(2.5s\) 且 \(\log\) 来源于树状数组是可以过的
当然本题存在线性做法 (然而没懂)
显然斜率优化,最大值维护上凸包
然而你会发现 \(L\) 的限制很可恨,对于入队的点,维护凸包时弹掉的点可能是以后的最优决策(因为\(L\)可以让你取不到没限制时的最优点,不得不往后选在 \(L\) 范围内的点,而这些点可能被维护凸包时弹掉了)
但要明确一点,如果你把可以用的决策点合成一块后维护上凸包,就可以用常规斜率优化弹点寻找最优点
那么我们如何快速把 \([L[i],i)\) 的所有决策提出来维护凸包?
再明确一件事,把 \([L[i],i)\) 分成连续的几块,对每块的最优值取最大值是等价于整块的最优值的(显然)
那么如何优秀地分块
注意到树状数组本身就是个前缀和,且拆成了 \(\log\) 块,可以让树状数组上每个点 \(x\) 维护一个区间的凸包(每个点维护个单调栈,开 \(\text{vector}\))
本题维护后缀和
这样就可以成功了
\(\text{Code}\)
#include <cstdio>
#include <vector>
#include <iostream>
#define LL long long
#define re register
using namespace std;
const int N = 5e6 + 5;
int n, L[N];
LL f[N];
inline int read(int &x)
{
x = 0; char ch = getchar();
while (!isdigit(ch)) ch = getchar();
while (isdigit(ch)) x = x * 10 + (ch ^ 48), ch = getchar();
}
inline double slope(int j, int k)
{
return 1.0 * (f[j] + 1LL * j * j + j - f[k] - 1LL * k * k - k) / (j - k);
}
struct Stack{
vector<int> Q;
inline int size(){return Q.size();}
inline int top1(){return Q[Q.size() - 1];}
inline int top2(){return Q[Q.size() - 2];}
inline void pop(){Q.pop_back();}
inline void push(int x){Q.push_back(x);}
};
struct BIT{
Stack t[N];
inline int lowbit(int x){return x & (-x);}
inline LL calc(int i, int j)
{
return f[j] + 1LL * (i - j) * (i - j - 1);
}
inline LL query(int x, int k)
{
LL res = 0;
for(; x <= n; x += lowbit(x))
{
while (t[x].size() > 1 && slope(t[x].top2(), t[x].top1()) < k) t[x].pop();
if (t[x].size()) res = max(res, calc(k / 2, t[x].top1()));
}
return res;
}
inline void insert(int i)
{
for(re int x = i; x; x -= lowbit(x))
{
while (t[x].size() > 1 && slope(t[x].top2(), t[x].top1()) < slope(t[x].top1(), i)) t[x].pop();
t[x].push(i);
}
}
}T;
int main()
{
freopen("jump.in", "r", stdin), freopen("jump.out", "w", stdout);
read(n);
for(re int i = 2; i <= n + 1; i++) read(L[i]), ++L[i];
T.insert(1);
for(re int i = 2; i <= n + 1; i++) f[i] = T.query(L[i], 2 * i), T.insert(i);
printf("%lld\n", f[n + 1]);
}
NOIP 模拟赛 左右横跳的更多相关文章
- 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程
数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...
- 10.16 NOIP模拟赛
目录 2018.10.16 NOIP模拟赛 A 购物shop B 期望exp(DP 期望 按位计算) C 魔法迷宫maze(状压 暴力) 考试代码 C 2018.10.16 NOIP模拟赛 时间:2h ...
- NOIP模拟赛-2018.11.6
NOIP模拟赛 今天想着反正高一高二都要考试,那么干脆跟着高二考吧,因为高二的比赛更有技术含量(我自己带的键盘放在这里). 今天考了一套英文题?发现阅读理解还是有一些困难的. T1:有$n$个点,$m ...
- NOI.AC NOIP模拟赛 第六场 游记
NOI.AC NOIP模拟赛 第六场 游记 queen 题目大意: 在一个\(n\times n(n\le10^5)\)的棋盘上,放有\(m(m\le10^5)\)个皇后,其中每一个皇后都可以向上.下 ...
- 2016-06-19 NOIP模拟赛
2016-06-19 NOIP模拟赛 by coolyangzc 共3道题目,时间3小时 题目名 高级打字机 不等数列 经营与开发 源文件 type.cpp/c/pas num.cpp/c ...
- 【HHHOJ】NOIP模拟赛 捌 解题报告
点此进入比赛 得分: \(30+30+70=130\)(弱爆了) 排名: \(Rank\ 22\) \(Rating\):\(-31\) \(T1\):[HHHOJ260]「NOIP模拟赛 捌」Dig ...
- NOIP模拟赛20161022
NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...
- contesthunter暑假NOIP模拟赛第一场题解
contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...
- NOIP模拟赛 by hzwer
2015年10月04日NOIP模拟赛 by hzwer (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...
- 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...
随机推荐
- 记录一次PyQt5内存泄漏的问题解决
前言 前几天利用python-mpv写了一个播放器,但是跑着跑着发现内存越来越大,经过我反复调试终于解决了这个问题. 解决思路 模块定位 首先我是一个模块一个模块测试的,这样可以尽快缩减出问题的代码范 ...
- Visual Studio高版本 ArcObject for .Net 低版本
在基于ArcGIS的开发中,经常会存在Visual Studio版本高,ArcObject for .Net 版本低的问题.例如Visual Studio 2015的环境下,安装ArcObject f ...
- Leetcode-SQL学习计划-SQL入门-1527.患某种疾病的患者【regexp正则表达式匹配】
链接:https://leetcode.cn/problems/patients-with-a-condition/ -- 1527.患某种疾病的患者 -- 链接:https://leetcode.c ...
- JavaFX入门笔记
JavaFX入门笔记 背景 Java选修课第四次实验 所需工具 IDEA JavaFX插件(需要Maven) JavaFX Scene Builder 参考资料 https://www.yiibai. ...
- <二>线程间互斥-mutex互斥锁和lock_guard
多线程程序 竞态条件:多线程程序执行的结果是一致的,不会随着CPU对线程不同的调用顺序而产生不同的运行结果. 解决?:互斥锁 mutex 经典的卖票问题,三个线程卖100张票 代码1 #include ...
- Django框架F查询与Q查询(全面了解)
一:F与Q查询 1.F查询的作用 能够帮助你直接获取到列表中某个字段对应的数据 注意: 在操作字符串类型的数据的时候, F不能够直接做到字符串的拼接 2.查询卖出书大于库存数的书籍 # 导入F查询 f ...
- Nmap扫描参数
执行Nmap/nmap --help查看帮助文档,将显示Namp的用法及其功能Nmap的相关参数的含义与用法:扫描目标时用到的参数:-iL:从文件中导入目标主机或目标网段-iR:随意选择目标主机--e ...
- 小型web产品的功能测试要点或测试大纲
本文参考配置啦:-- Web类产品功能测试大纲,黑盒测试参考测试范围 [官网]:无 应用场景 黑盒测试,功能测试中常常需要考虑很多问题,这里根据本人的工作经验遇到的进行了系列总结.给出了一个常用的测试 ...
- [编程基础] Python列表解析总结
在本教程中,我们将学习使用Python列表解析(list comprehensions)相关知识 1 使用介绍 列表解析是一种基于现有列表创建列表的句法结构.列表解析提供了创建列表的简洁方法.通常需要 ...
- electron + go 如何从sqlite获取数据
我现在的数据在sqlite中,保存在mac本地的一个文件中.用了electron+vue搭建了一个客户端. 我大概希望是这样的逻辑,先加载本地db文件,然后再获取数据. 这里就有一个问题,我怎么获取s ...