\(\mathcal{Description}\)

  Link.

  有 \(n\) 个编号 \(1\sim n\) 的格子排成一排,并有三个权值序列 \(\{a_n\},\{h_n\},\{p_n\}\),其中 \(\{p_n\}\) 是一个排列。从 \(i\) 跳到 \(j\),必须满足 \(i<j\land p_i<p_j\),代价为 \((h_i-h_j)^2+a_j\),求从 \(1\) 跳到 \(n\) 的最小代价。

  \(n,h_i\le6\times10^5\)。

\(\mathcal{Solution}\)

  不就是个板子套板子吗你还水题解。

  设 \(f(i)\) 表示从 \(1\) 跳到 \(i\) 的最小代价,显然

\[\begin{aligned}f(i) &= \min_{j<i,p_j<p_i}\{f(j)+a_i+(h_i-h_j)^2\}\\&= a_i+h_i^2+\min_{j<i,p_j<p_i}\{f(j)+h_j^2-2h_ih_j\}.\end{aligned}
\]

转移条件是二维偏序关系,反手一个 CDQ,转移最优化的是一次函数,再丢一个李超树,复杂度 \(\mathcal O(n\log n\log h)\)。

  比树套树好写不知道多少,而且跑得飞快。

\(\mathcal{Code}\)

/*~Rainybunny~*/

#include <bits/stdc++.h>

#define rep( i, l, r ) for ( int i = l, rep##i = r; i <= rep##i; ++i )
#define per( i, r, l ) for ( int i = r, per##i = l; i >= per##i; --i ) inline char fgc() {
static char buf[1 << 17], *p = buf, *q = buf;
return p == q && ( q = buf + fread( p = buf, 1, 1 << 17, stdin ), p == q )
? EOF : *p++;
} inline int rint() {
int x = 0, f = 1, s = fgc();
for ( ; s < '0' || '9' < s; s = fgc() ) f = s == '-' ? -f : f;
for ( ; '0' <= s && s <= '9'; s = fgc() ) x = x * 10 + ( s ^ '0' );
return x * f;
} typedef long long LL; inline void chkmin( LL& a, const LL b ) { b < a && ( a = b ); } const int MAXN = 6e5;
const LL LINF = 1ll << 60;
int n, mxh, h[MAXN + 5], p[MAXN + 5], a[MAXN + 5];
LL f[MAXN + 5];
std::vector<int> ord[MAXN * 2 + 5]; struct Line {
LL k, b;
inline LL operator () ( const int x ) { return k * x + b; }
}; struct SegmentTree {
Line line[MAXN + 5];
int lcnt, vers, ver[MAXN << 2], idx[MAXN << 2]; inline void clear() { lcnt = 0, ++vers; } inline void insert( const int u, const int l, const int r, int id ) {
if ( ver[u] != vers ) return idx[u] = id, ver[u] = vers, void();
int mid = l + r >> 1;
if ( line[idx[u]]( mid ) > line[id]( mid ) ) std::swap( idx[u], id );
if ( l == r ) return ;
if ( line[idx[u]]( l ) > line[id]( l ) ) {
insert( u << 1, l, mid, id );
} else if ( line[idx[u]]( r ) > line[id]( r ) ) {
insert( u << 1 | 1, mid + 1, r, id );
}
} inline void insert( const Line& l ) {
line[++lcnt] = l, insert( 1, 1, mxh, lcnt );
} inline LL query( const int u, const int l, const int r, const int x ) {
if ( ver[u] != vers ) return LINF;
LL ret = line[idx[u]]( x );
if ( l == r ) return ret;
int mid = l + r >> 1;
if ( x <= mid ) chkmin( ret, query( u << 1, l, mid, x ) );
else chkmin( ret, query( u << 1 | 1, mid + 1, r, x ) );
return ret;
}
} sgt; #define id( l, r ) ( ( l + r ) | ( l != r ) )
inline void build( const int l, const int r ) {
int u = id( l, r ); ord[u].resize( r - l + 1 );
if ( l == r ) return void( ord[u][0] = l );
int mid = l + r >> 1, lc = id( l, mid ), rc = id( mid + 1, r );
build( l, mid ), build( mid + 1, r );
std::merge( ord[lc].begin(), ord[lc].end(), ord[rc].begin(), ord[rc].end(),
ord[u].begin(), []( const int x, const int y ) { return p[x] < p[y]; } );
} inline void solve( const int l, const int r ) {
if ( l == r ) return ;
int mid = l + r >> 1;
solve( l, mid ), sgt.clear();
for ( int u: ord[id( l, r )] ) {
if ( u <= mid && f[u] != LINF ) {
sgt.insert( { -2ll * h[u], 1ll * h[u] * h[u] + f[u] } );
} else if ( u > mid ) {
chkmin( f[u], 1ll * h[u] * h[u] + a[u]
+ sgt.query( 1, 1, mxh, h[u] ) );
}
}
solve( mid + 1, r );
}
#undef id int main() {
n = rint();
rep ( i, 1, n ) p[i] = rint();
rep ( i, 1, n ) a[i] = rint();
rep ( i, 1, n ) h[i] = rint(), mxh = std::max( mxh, h[i] ); f[1] = a[1];
rep ( i, 2, n ) f[i] = LINF;
build( 1, n ), solve( 1, n );
printf( "%lld\n", f[n] );
return 0;
}

Solution -「CodeChef JUMP」Jump Mission的更多相关文章

  1. Solution -「ARC 104E」Random LIS

    \(\mathcal{Description}\)   Link.   给定整数序列 \(\{a_n\}\),对于整数序列 \(\{b_n\}\),\(b_i\) 在 \([1,a_i]\) 中等概率 ...

  2. Solution -「CTS 2019」「洛谷 P5404」氪金手游

    \(\mathcal{Description}\)   Link.   有 \(n\) 张卡牌,第 \(i\) 张的权值 \(w_i\in\{1,2,3\}\),且取值为 \(k\) 的概率正比于 \ ...

  3. Solution -「BZOJ 3812」主旋律

    \(\mathcal{Description}\)   Link.   给定含 \(n\) 个点 \(m\) 条边的简单有向图 \(G=(V,E)\),求 \(H=(V,E'\subseteq E)\ ...

  4. Solution -「CF 1342E」Placing Rooks

    \(\mathcal{Description}\)   Link.   在一个 \(n\times n\) 的国际象棋棋盘上摆 \(n\) 个车,求满足: 所有格子都可以被攻击到. 恰好存在 \(k\ ...

  5. Solution -「简单 DP」zxy 讲课记实

    魔法题位面级乱杀. 「JOISC 2020 Day4」治疗计划 因为是不太聪明的 Joker,我就从头开始理思路了.中途也会说一些和 DP 算法本身有关的杂谈,给自己的冗长题解找借口. 首先,治疗方案 ...

  6. Solution -「基环树」做题记录

    写的大多只是思路,比较简单的细节和证明过程就不放了,有需者自取. 基环树简介 简单说一说基环树吧.由名字扩展可得这是一类以环为基础的树(当然显然它不是树. 通常的表现形式是一棵树再加一条非树边,把图画 ...

  7. 「CodeChef - SKIRES」Ski Resort

    题目链接 戳我 \(Description\) 给你一个\(n*m\)的网格,以及网格上的两个格子\(A,B\).每个格子有一个高度.每次操作可以选择一个格子(不能是\(A\)或\(B\))并将它的高 ...

  8. Solution -「WC 2022」秃子酋长

    \(\mathscr{Description}\)   Link. (It's empty temporarily.)   给定排列 \(\{a_n\}\),\(q\) 次询问,每次给出 \([l,r ...

  9. Solution -「JSOI 2019」「洛谷 P5334」节日庆典

    \(\mathscr{Description}\)   Link.   给定字符串 \(S\),求 \(S\) 的每个前缀的最小表示法起始下标(若有多个,取最小的).   \(|S|\le3\time ...

随机推荐

  1. sqlserver - 某字段数据为json串, 获取该json串里的值 的详细方法

    1.前言 某字段的数据为json 但是我想只获取里面的某一个值,该怎么操作? 2.笔记 (1)用 JSON_VALUE(参数1,参数2)函数 ,有两个参数, (2)参数1 为 列名 ,参数2 为 js ...

  2. 创建react开发环境

    准备工作 1.下载node.js(http://nodejs.cn/download/)推荐下载长期支持的版本 2.下载cnpm(https://jingyan.baidu.com/article/9 ...

  3. 新增访客数量MR统计之NewInstallUserMapper相关准备

    关注公众号:分享电脑学习回复"百度云盘" 可以免费获取所有学习文档的代码(不定期更新)云盘目录说明:tools目录是安装包res 目录是每一个课件对应的代码和资源等doc 目录是一 ...

  4. yum安装软件时,出现"No package XXX available"的解决办法

    第一种: 依次执行以下命令解决 1,cd /home 2,wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noa ...

  5. 【Java】Super

    Super super用于调用父类的属性.方法.构造器,与this相同. super的使用 属性与方法 在子类的方法或构造器中.通过使用"super.属性"或"super ...

  6. 网络编程-HTTP cookie

    目录 1.cookie的起源 2.cookie是什么? 3.创建cookie 3.1.响应首部 Set-Cookie 3.2.请求首部 Cookie 3.3.Document.cookie 4.HTT ...

  7. [开发笔记usbTOcan]软件需求分析和软件架构设计

    前面文章进行了系统分析和系统架构设计,手工焊接了一个板子,集合EK-TMC123GXL开发板(请忽略焊接技术) SWE.1 | 软件需求分析 软件需求分析过程的目的是将系统需求的软件相关部分转化为一组 ...

  8. 2022GDUT寒训专题一J题

    题目 题面 给你一个长度为 n的整数序列{A1,A2,⋯,A**n},要求从中找出一段连续的长度不超过 m的非空子序列,使得这个序列的和最大. 输入格式 第一行为两个整数 n,m: 第二行为 n个用空 ...

  9. gin框架中多种数据格式返回请求结果

    返回四种格式的数据:1. []byte.string  2. json格式  3. html模板渲染  4. 静态资源设置 package main import ( "github.com ...

  10. gin中映射查询字符串或表单参数

    package main import ( "fmt" "github.com/gin-gonic/gin" ) func main() { r := gin. ...