f[i] = min { f[j] + sqr(a[i] - a[j]) }

f[i]= min { -2 * a[i] * a[j] + a[j] * a[j] + f[j] } + a[i] * a[i]

由于a[i]不是单调递增的,不能直接斜率dp。

考虑有cdq分治来做,复杂度(nlog2n)

 #include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std; #define maxn 100008
#define LL long long long long f[maxn];
int a[maxn],b[maxn];
int n;
bool flag=; void read(int &x){
char ch;
for (ch=getchar();ch<''||ch>'';ch=getchar()); x=ch-;
for (ch=getchar();ch>=''&&ch<='';ch=getchar()) x=x*+ch-;
} void init(){
read(n);
for (int i=;i<=n;i++) { read(a[i]); read(b[i]); if (b[i]) flag=; }
for (int i=;i<=n;i++) f[i]=(LL)<<;
} void force(){
for (int i=;i<=n;i++)
for (int j=;j<=i-;j++)
if (a[j]>=b[i])
f[i]=min(f[i],f[j]+(LL)(a[i]-a[j])*(a[i]-a[j])); } int q[maxn],rk[maxn];
bool cmp(int i,int j){
return a[i]<a[j] ;
} long long kx(int i,int j){
return *(a[i]-a[j]);
} long long ky(int i,int j){
long long ans=1LL*a[i]*a[i]+f[i]-1LL*a[j]*a[j]-f[j];
return ans;
} bool cmp1(int i,int j,int k){
return ky(k,j)*kx(j,i)<=kx(k,j)*ky(j,i);
} bool cmp2(int i,int j,int k){
return ky(i,j)>=k*kx(i,j);
} void solve(int l,int r){
if (l==r) return;
int mid=(l+r)>>;
solve(l,mid);
for (int i=l;i<=r;i++) rk[i]=i;
sort(rk+l,rk+r+,cmp);
int h=,t=;
for (int i=l;i<=r;i++)
{
if (rk[i]<=mid) {
while (h<t&&cmp1(q[t-],q[t],rk[i])) t--;
q[++t]=rk[i];
} else {
while (h<t&&cmp2(q[h],q[h+],a[rk[i]])) h++;
f[rk[i]]=min(f[rk[i]],f[q[h]]+1LL*(a[rk[i]]-a[q[h]])*(a[rk[i]]-a[q[h]]));
}
}
solve(mid+,r);
}
int main(){
init();
if (n<=) force();
if (flag) solve(,n);
printf("%.4f",sqrt(f[n]));
}

斜率dp cdq 分治的更多相关文章

  1. bzoj 2726 [SDOI2012]任务安排(斜率DP+CDQ分治)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2726 [题意] 将n个任务划分成若干个块,每一组Mi任务花费代价(T+sigma{ t ...

  2. 斜率dp+cdq分治

    写在前面 这个东西应该是一个非常重要的套路......所以我觉得必须写点什么记录一下,免得自己忘掉了 一直以来我的斜率dp都掌握的不算很好......也很少主动地在比赛里想到 写这个的契机是noi.a ...

  3. bzoj 1492 [NOI2007]货币兑换Cash(斜率dp+cdq分治)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1492   [题意] 有AB两种货币,每天可以可以付IPi元,买到A券和B券,且A:B= ...

  4. 【bzoj3672】[Noi2014]购票 斜率优化dp+CDQ分治+树的点分治

    题目描述  给出一棵以1为根的带边权有根树,对于每个根节点以外的点$v$,如果它与其某个祖先$a$的距离$d$不超过$l_v$,则可以花费$p_vd+q_v$的代价从$v$到$a$.问从每个点到1花费 ...

  5. bzoj 2244 [SDOI2011]拦截导弹(DP+CDQ分治+BIT)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2244 [题意] 给定n个二元组,求出最长不上升子序列和各颗导弹被拦截的概率. [思路] ...

  6. BZOJ_3963_[WF2011]MachineWorks_斜率优化+CDQ分治

    BZOJ_3963_[WF2011]MachineWorks_斜率优化+CDQ分治 Description 你是任意性复杂机器公司(Arbitrarily Complex Machines, ACM) ...

  7. 【BZOJ-1492】货币兑换Cash DP + 斜率优化 + CDQ分治

    1492: [NOI2007]货币兑换Cash Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 3396  Solved: 1434[Submit][Sta ...

  8. 洛谷.4655.[CEOI2017]Building Bridges(DP 斜率优化 CDQ分治)

    LOJ 洛谷 \(f_i=s_{i-1}+h_i^2+\min\{f_j-s_j+h_j^2-2h_i2h_j\}\),显然可以斜率优化. \(f_i-s_{i-1}-h_i^2+2h_ih_j=f_ ...

  9. BZOJ.1492.[NOI2007]货币兑换(DP 斜率优化 CDQ分治/Splay)

    BZOJ 洛谷 如果某天能够赚钱,那么一定会在这天把手上的金券全卖掉.同样如果某天要买,一定会把所有钱花光. 那么令\(f_i\)表示到第\(i\)天所拥有的最多钱数(此时手上没有任何金券),可以选择 ...

随机推荐

  1. Provisioning Profile 导入真机

    双击Provisioning Profile文件. 然后在xcode中运行. 会自动导入手机.

  2. html5的标签

    1.article与section div的区别 当一个标签只是为了样式化或者方便脚本使用时,应该使用 div . section 表示一段专题性的内容,一般会带有标题.,section 应用的典型场 ...

  3. HTML5的 2D SVG和SVG DOM的学习笔记(1)

    (项目中要使用SVG,只好补充知识了) HTML体系中,最常用的绘制矢量图的技术是SVG和HTML5新增加的canvas元素.这两种技术都支持绘制矢量图和光栅图. 一.SVG概述 可缩放矢量图形(Sc ...

  4. econ

    1) If Ep > 1, Demand is elastic. 2) If Ep < 1, Demand is inelastic 3) If Ep = 1, Demand has un ...

  5. Cookie实例,理解cookie

    一.一句话了解cookie是什么 cookie是服务端发送给客户端的.用来记录一些信息(如用户名),定制主页,聚焦广告的.最终以文件形式存在于客户端电脑磁盘下的小型文档. 二.用实例来认清cookie ...

  6. linux命令行快捷键

    linux命令行编辑快捷键 先总结几个个人觉得最有用的 ctrl + ? 撤消前一次输入 ctrl + c 另起一行 ctrl + r 输入单词搜索历史命令 ctrl + u 删除光标前面所有字符相当 ...

  7. ext DateTime.js在ie下显示不全

    问题: ext在使用DateTime.js的时候会出现在日期控件在ie下显示不完成.如图  少了底部的“今天按钮”. 解决方法: 在ext/ux/form/DateTime.js (我的是这个路径,根 ...

  8. POJ 3006 Dirichlet's Theorem on Arithmetic Progressions 素数 难度:0

    http://poj.org/problem?id=3006 #include <cstdio> using namespace std; bool pm[1000002]; bool u ...

  9. 长理ACM 13-围圈报数(谌海军)

    题目标题:围圈报数(谌海军) 题目描述:有n(n<=100)围成一圈,顺序排号(从1排到n).从第一个人开始报数(从1报到m(m<=9)),凡报到m的人退出圈子,问最后留下的是原来第几号的 ...

  10. jquery animate()方法使用的注意事项

    当使用 animate() 时,必须使用 Camel 标记法书写所有的属性名,比如,必须使用 paddingLeft 而不是 padding-left,使用 marginRight 而不是 margi ...