\(JUMP\)

很容易写出转移柿子

\[f_i=\min_{p_j<p_i}\{(h_i-h_j)^2+f_j\}+w_i
\]

把\(\min\)里面的东西展开一下

\[f_j=\min_{p_j<p_i}\{-2h_jh_i+h_j^2+f_j\}+h_i^2+w_i
\]

里面的\(\min\)是一个一次函数

首先这是一个类似于区间查询的东西,我们可以用树状数组

里面查询的东西是一个最小值,也就是说我们要资瓷插入一次函数并求最小值,超哥线段树就行了

所以这其实是个树套树,不过树状数组套什么都挺好写就是了

话说动态凸包好像比超哥线段树快很多?可为啥我写动态凸包好慢啊……李超线段树快多了……

李超线段树代码

//minamoto
#include<bits/stdc++.h>
#define R register
#define inline __inline__ __attribute__((always_inline))
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
using namespace std;
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
int read(){
R int res,f=1;R char ch;
while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
return res*f;
}
typedef long long ll;
const int N=3e5+5,M=2e6+5;const ll inf=(1ll<<60);
struct node;typedef node* ptr;
struct node{
ptr lc,rc;ll k,b,lv,rv;bool flag;
inline void ins(R ll kk,R ll bb,R int l,R int r){k=kk,b=bb,lv=l*k+b,rv=r*k+b,flag=1;}
inline ll calc(R int x){return k*x+b;}
}e[M],*rt[N],*pp=e+1;
inline ptr newnode(){return pp->lc=pp->rc=e,pp++;}
ll b,k,bb,kk,res,f[N];int p[N],h[N],w[N],n,mx;
void query(ptr p,int l,int r,int x){
cmin(res,p->calc(x));if(p==e||l==r)return;
int mid=(l+r)>>1;
x<=mid?query(p->lc,l,mid,x):query(p->rc,mid+1,r,x);
}
void update(ptr &p,int l,int r){
if(p==e)p=newnode();if(!p->flag)return p->ins(k,b,l,r),void();
int mid=(l+r)>>1;ll lv=k*l+b,rv=k*r+b;
if(lv>=p->lv&&rv>=p->rv)return;
if(lv<=p->lv&&rv<=p->rv)return p->ins(k,b,l,r),void();
double x=(b-p->b)/(p->k-k);
if(lv<=p->lv){
if(x<=mid)update(p->lc,l,mid);
else kk=p->k,bb=p->b,p->ins(k,b,l,r),k=kk,b=bb,update(p->rc,mid+1,r);
}else{
if(x<=mid)kk=p->k,bb=p->b,p->ins(k,b,l,r),k=kk,b=bb,update(p->lc,l,mid);
else update(p->rc,mid+1,r);
}
}
inline void upd(R int x,R ll kk,R ll bb){for(;x<=n;x+=x&-x)k=kk,b=bb,update(rt[x],1,mx);}
inline void query(R int x,R int c){res=inf;for(;x;x-=x&-x)query(rt[x],1,mx,c);}
int main(){
// freopen("testdata.in","r",stdin);
n=read();
fp(i,1,n)p[i]=read();
fp(i,1,n)w[i]=read();
fp(i,1,n)h[i]=read(),cmax(mx,h[i]);
fp(i,1,n)rt[i]=e;e->b=inf;
f[1]=w[1],upd(p[1],-(h[1]<<1),f[1]+1ll*h[1]*h[1]);
fp(i,2,n){
R int H=h[i];query(p[i]-1,H);
f[i]=res+1ll*H*H+w[i];
upd(p[i],-(H<<1),f[i]+1ll*H*H);
}
printf("%lld\n",f[n]);
return 0;
}

动态凸包代码

//minamoto
#include<bits/stdc++.h>
#define R register
#define inline __inline__ __attribute__((always_inline))
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
using namespace std;
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
int read(){
R int res,f=1;R char ch;
while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
return res*f;
}
typedef long long ll;
const int N=3e5+5;const ll inf=(1ll<<60);
ll res,f[N];int p[N],h[N],w[N],n,mx;bool qwq;
struct Line{
ll k,b;mutable ll p;
inline Line(R ll kk,R ll bb,R ll pp){k=kk,b=bb,p=pp;}
inline bool operator <(const Line &b)const{return qwq?p<b.p:k>b.k;}
};
struct node;typedef multiset<Line>::iterator IT;
struct node{
multiset<Line>s;
bool inter(IT itl,IT itr){
if(itr==s.end())return itl->p=inf,0;
if(itl->k==itr->k)itl->p=itl->b>itr->b?-inf:inf;
else itl->p=(itr->b-itl->b)/(itl->k-itr->k);
return itl->p>=itr->p;
}
void ins(ll k,ll b){
IT it,z=s.insert(Line(k,b,0)),y=z++,x=y;
for(;inter(y,z);it=z,++z,s.erase(it));
if(x!=s.begin()&&inter(--x,y))it=y,++y,s.erase(it),inter(x,y);
for(;(y=x)!=s.begin()&&(--x)->p>=y->p;it=y,++y,s.erase(it),inter(x,y));
}
void query(R int x){
qwq=1;IT it=s.lower_bound(Line(0,0,x));qwq=0;
cmin(res,it==s.end()?inf:it->k*x+it->b);
}
}s[N];
inline void upd(R int x,R ll k,R ll b){for(;x<=n;x+=x&-x)s[x].ins(k,b);}
inline void query(R int x,R int c){res=inf;for(;x;x-=x&-x)s[x].query(c);}
int main(){
// freopen("testdata.in","r",stdin);
n=read();
fp(i,1,n)p[i]=read();
fp(i,1,n)w[i]=read();
fp(i,1,n)h[i]=read();
f[1]=w[1],upd(p[1],-(h[1]<<1),f[1]+1ll*h[1]*h[1]);
fp(i,2,n){
R int H=h[i];query(p[i]-1,H);
f[i]=res+1ll*H*H+w[i];
upd(p[i],-(H<<1),f[i]+1ll*H*H);
}
printf("%lld\n",f[n]);
return 0;
}

Code Chef JUMP(递推+树状数组+李超线段树)的更多相关文章

  1. st表、树状数组与线段树 笔记与思路整理

    已更新(2/3):st表.树状数组 st表.树状数组与线段树是三种比较高级的数据结构,大多数操作时间复杂度为O(log n),用来处理一些RMQ问题或类似的数列区间处理问题. 一.ST表(Sparse ...

  2. HDU 5877 2016大连网络赛 Weak Pair(树状数组,线段树,动态开点,启发式合并,可持久化线段树)

    Weak Pair Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Tota ...

  3. 【序列操作IV】树状数组套线段树/树套树

    题目描述 给出序列 a1,a2,…,an(0≤ai≤109),有关序列的两种操作. 1. ai(1≤i≤n)变成 x(0≤x≤109). 2. 求 al,al+1,…,ar(1≤l≤r≤n)第 k(1 ...

  4. HYSBZ - 3813 奇数国 欧拉函数+树状数组(线段树)

    HYSBZ - 3813奇数国 中文题,巨苟题,巨无敌苟!!首先是关于不相冲数,也就是互质数的处理,欧拉函数是可以求出互质数,但是这里的product非常大,最小都2100000,这是不可能实现的.所 ...

  5. bzoj 3110: [Zjoi2013]K大数查询 树状数组套线段树

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1384  Solved: 629[Submit][Stat ...

  6. [BZOJ 3196] 213平衡树 【线段树套set + 树状数组套线段树】

    题目链接:BZOJ - 3196 题目分析 区间Kth和区间Rank用树状数组套线段树实现,区间前驱后继用线段树套set实现. 为了节省空间,需要离线,先离散化,这样需要的数组大小可以小一些,可以卡过 ...

  7. [BZOJ 1901] Dynamic Rankings 【树状数组套线段树 || 线段树套线段树】

    题目链接:BZOJ - 1901 题目分析 树状数组套线段树或线段树套线段树都可以解决这道题. 第一层是区间,第二层是权值. 空间复杂度和时间复杂度均为 O(n log^2 n). 线段树比树状数组麻 ...

  8. POJ 1195 Mobile phones (二维树状数组或线段树)

    偶然发现这题还没A掉............速速解决了............. 树状数组和线段树比较下,线段树是在是太冗余了,以后能用树状数组还是尽量用......... #include < ...

  9. 【BZOJ3196】二逼平衡树(树状数组,线段树)

    [BZOJ3196]二逼平衡树(树状数组,线段树) 题面 BZOJ题面 题解 如果不存在区间修改操作: 搞一个权值线段树 区间第K大--->直接在线段树上二分 某个数第几大--->查询一下 ...

随机推荐

  1. Spring框架的AOP技术之通知类型

    1. 通知类型 * @Before -- 前置通知 * @AfterReturing -- 后置通知 * @Around -- 环绕通知(目标对象方法默认不执行的,需要手动执行) * @After - ...

  2. Linux下使用openssl生成证书

    利用OpenSSL生成库和命令程序,在生成的命令程序中包括对加/解密算法的测试,openssl程序,ca程序.利用openssl,ca可生成用于C/S模式的证书文件以及CA文件. 参考:http:// ...

  3. PAT 1084 外观数列(20)(代码+思路+推荐测试用例)

    1084 外观数列(20 分) 外观数列是指具有以下特点的整数序列: d, d1, d111, d113, d11231, d112213111, ... 它从不等于 1 的数字 d 开始,序列的第 ...

  4. code1002 搭桥

    最小生成树 每读入一个城市,把他与之前的所有城市做一次link() link的内容: 1.如果两个城市直接相连,合并他们的集合(并查集)2.如果两个城市可以搭桥,添加一条边来连接.如果不可以搭桥,什么 ...

  5. Mockplus微信小程序上线!扫一扫轻松查看原型!

    Mockplus团队发布了Mockplus微信小程序. 从现在起,你无需下载Mockplus移动端,用微信扫一扫二维码,即可在微信中打开并查看原型.Mockplus微信小程序,无需安装.卸载,不占用手 ...

  6. 不能错过的Sketch实用新技巧和资源集锦

    Sketch是一款基于Mac的矢量绘图应用.面对着功能复杂繁琐的photoshop,Sketch相比较而言身轻如燕.最近也掀起了用Sketch设计产品原型的热潮,因为用它来画设计稿简直轻而易举,相比于 ...

  7. DB2分页查询SQL

    select * from (select row_number() over() as rown,tpag.* from(SELECT int(COALESCE(列名1,0)),COALESCE(列 ...

  8. SQA计划和系统测试规程

    SQA计划和系统测试规程 一.SQA计划 1.软件工程 我们小组所做的项目是图书馆管理系统.我们要准确的了解此软件的需求(能够注册登录,查询图书,借书,还书,查看借阅记录等),在此前提进行建模,基于场 ...

  9. 管理型交换机IEEE 802.1Q VLAN设置应用实例

    转载标注: IEEE802.1Q 我粗略理解为对交换机入口规则和出口规则设置,入口打上VID,设置从哪些口可以出去,并且是否带标签. 一 VLAN的概念 VLAN(Virtual Local Area ...

  10. [GO]删除切片的某个值

    func removePro(ddbenv []*model.EnvInfo, k int) []*model.EnvInfo { :]...) } for k, v := range ddbenv ...