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/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...
随机推荐
- mysql数据库报错 sql 1452 Cannot add or update a child row:a foreign key constraint fails
其实这句话的意思就是你添加一个值是一个外键,但是这个外键不在关联的数据库中的主键中,这样就导致了添加失败了,解决办法就是添加对应关联数据库的主键的值,不过我要提醒一下!(也就是我采的坑!) 一定要看清 ...
- vue3 + element plus 使用字节跳动图标
使用场景: 提一下vue2 用法>> 下面回到正题 vue3 用法 1 安装包: npm install @icon-park/vue-next --save 2 字节跳动图标库取图地 ...
- 通过Shell脚本自动安装Hive&JDBC测试&提供CDH5网盘地址
〇.参考地址 1.Linux下编写脚本自动安装hive https://blog.csdn.net/weixin_44911081/article/details/121227024?ops_requ ...
- python爬虫爬取网易云音乐(超详细教程,附源码)
一. 前言 先说结论,目前无法下载无损音乐,也无法下载vip音乐. 此代码模拟web网页js加密的过程,向api接口发送参数并获取数据,仅供参考学习,如果需要下载网易云音乐,不如直接在客户端下载,客户 ...
- java时区相关问题(被恶心到了)
在项目开发中,遇到了mysql5.7数据库相关的时区问题.整理如下: 问题一:在使用swagger测试接口时,数据库记录的时间和输入的不一致.如下图: swagger中输入的是:"recei ...
- 通过 CancellationToken 提高 Web 性能
在 Web 开发中,经常会遇到这样的场景:用户发起一个请求,Web 服务器执行一些计算密集型的操作,等待结果返回给用户.这种情况下,如果用户在等待结果的过程中取消了请求,那么服务器端依然会继续执行计算 ...
- docker registry(私库)搭建,使用,WEB可视化管理部署
Docker Registry 是Docker官方一个镜像,可以用来储存和分发Docker镜像.目前比较流行的两个镜像私库是Docker Registry ,HarBor 其中HarBor最合适企业级 ...
- python 学生管理系统 文件版 增删改查
# 在程序开始之前完成数据的读取 # 存在着循环 # 循环的内容 # 将操作内容分解为函数 def sel_student(students_list): """ 查看所 ...
- 【分布式技术专题】「LVS负载均衡」全面透析Web基础架构负载均衡LVS机制的原理分析指南
前提概要 在大规模互联网应用中,负载均衡设备是必不可少的组成部分,源于互联网应用的高并 发和大流量的冲击压力场景下,通常会在服务端部署多个无状态的应用服务器和若干有状态的存储服务器(数据库.缓存等等) ...
- [Untiy]贪吃蛇大作战(四)——游戏主界面
游戏主界面: 由于这个场景比较复杂,需要分几个部分实现: 1.游戏背景 首先我们的游戏场景上包括了一个大的背景图片,之外再包围一个红色的区域.中间的区域才是可活动的区域,周围通过碰撞检测盒来检测是否有 ...