题目

将\(n\)座山(给定高度和\(n\))分成两个集合(按照原次序排列),然后在两个集合前加入海拔为0的平地

现在YC——一名julao,会两次从平地开始沿竖直方向跳到下一座山(别问我怎么做到的),直至跳完该集合的所有山,

问两次重力做功和克服重力做功的最小值,你可以把他的重力视为\(1N\)(两个鸡蛋用手托起的力),可以一次跳完


分析

设\(dp[i]\)表示最后一个区间为\([i\sim n]\)的最小值(不计算最后一个区间内部答案)

那么\(dp[i]=min\{dp[j]+s[i-1]-s[j]+|h[i]-h[j-1]|\}\)

枚举不同的集合\(j\),那么\(i\)就接到\(j\)的前一个(\(s\)是前缀高度绝对值)

考虑不变量只有\(s[i-1]\),绝对值得拆开分别求,一般用数据结构维护,这里用的是树状数组

注意要离散高度,对于某个\(j\)就把\(dp[j]-s[j]\pm h[j-1]\)扔进树状数组里,但是注意要以\(h[j-1]\)的实际下标维护


代码

#include <cstdio>
#include <cctype>
#include <algorithm>
#define rr register
using namespace std;
const int N=500011;
typedef long long lll;
int n,h[N],a[N],m; lll s[N],dp[N],c[N],ans;
inline signed abs(int x){return x<0?-x:x;}
inline lll min(lll a,lll b){return a<b?a:b;}
struct Tree_Array{
lll c[N];
inline void update(int x,lll y){
for (;x<=m;x+=-x&x) c[x]=min(c[x],y);
}
inline lll query(int x){
rr lll ans=1e15;
for (;x;x-=-x&x) ans=min(ans,c[x]);
return ans;
}
}cpr,csu;
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
signed main(){
n=iut();
for (rr int i=1;i<=n;++i) a[i]=h[i]=iut(),s[i]=s[i-1]+abs(h[i]-h[i-1]);
a[n+1]=0,sort(a+1,a+2+n),m=unique(a+1,a+2+n)-a-1,ans=1e15;
for (rr int i=1;i<=m;++i) cpr.c[i]=csu.c[i]=ans;
for (rr int i=1,lpr=1,lsu=m;i<=n;++i){
rr int pr=lower_bound(a+1,a+1+m,h[i])-a,su=m-pr+1;
dp[i]=s[i-1]+min(h[i]+cpr.query(pr),csu.query(su)-h[i]);
if (i==1) dp[i]=h[i];
cpr.update(lpr,dp[i]-s[i]-h[i-1]);
csu.update(lsu,dp[i]-s[i]+h[i-1]);
ans=min(ans,dp[i]+s[n]-s[i]),lpr=pr,lsu=su;
}
return !printf("%lld",ans);
}

#dp、树状数组#JZOJ 3859 孤独一生的更多相关文章

  1. 树形DP+树状数组 HDU 5877 Weak Pair

    //树形DP+树状数组 HDU 5877 Weak Pair // 思路:用树状数组每次加k/a[i],每个节点ans+=Sum(a[i]) 表示每次加大于等于a[i]的值 // 这道题要离散化 #i ...

  2. bzoj 1264 [AHOI2006]基因匹配Match(DP+树状数组)

    1264: [AHOI2006]基因匹配Match Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 793  Solved: 503[Submit][S ...

  3. 【bzoj2274】[Usaco2011 Feb]Generic Cow Protests dp+树状数组

    题目描述 Farmer John's N (1 <= N <= 100,000) cows are lined up in a row andnumbered 1..N. The cows ...

  4. 奶牛抗议 DP 树状数组

    奶牛抗议 DP 树状数组 USACO的题太猛了 容易想到\(DP\),设\(f[i]\)表示为在第\(i\)位时方案数,转移方程: \[ f[i]=\sum f[j]\;(j< i,sum[i] ...

  5. codeforces 597C C. Subsequences(dp+树状数组)

    题目链接: C. Subsequences time limit per test 1 second memory limit per test 256 megabytes input standar ...

  6. HDU 2227 Find the nondecreasing subsequences (DP+树状数组+离散化)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2227 Find the nondecreasing subsequences             ...

  7. ccpc_南阳 C The Battle of chibi dp + 树状数组

    题意:给你一个n个数的序列,要求从中找出含m个数的严格递增子序列,求能找出多少种不同的方案 dp[i][j]表示以第i个数结尾,形成的严格递增子序列长度为j的方案数 那么最终的答案应该就是sigma( ...

  8. HDU 2838 (DP+树状数组维护带权排序)

    Reference: http://blog.csdn.net/me4546/article/details/6333225 题目链接: http://acm.hdu.edu.cn/showprobl ...

  9. [poj3378] Crazy Thairs (DP + 树状数组维护 + 高精度)

    树状数组维护DP + 高精度 Description These days, Sempr is crazed on one problem named Crazy Thair. Given N (1 ...

  10. HDU 2836 Traversal 简单DP + 树状数组

    题意:给你一个序列,问相邻两数高度差绝对值小于等于H的子序列有多少个. dp[i]表示以i为结尾的子序列有多少,易知状态转移方程为:dp[i] = sum( dp[j] ) + 1;( abs( he ...

随机推荐

  1. win32 - 富文本控件的文本突出显示和文本撤销

    #define UNICODE #define _UNICODE #include <tchar.h> #include <windows.h> #include <wi ...

  2. 【Azure App Service】当App Service中使用系统标识无法获取Access Token时

    问题描述 App Serive上的应用配置了系统标识(System Identity),通过系统标识获取到访问Key Vault资源的Access Token.但这次确遇见了无法获取到正常的Acces ...

  3. 【Azure Redis 缓存】Azure Redis 4.0 被扫描到漏洞,如何修补呢?

    问题描述 在安全级别要求高的公司中,任何系统都会进行安全扫描.比如Azure 云上的Redis服务,也在扫描的范围中,最后发现Redis 4.0存在以下漏洞: CVE-2019-10192:https ...

  4. 浅入Kubernetes(4):使用Minikube体验

    Minikube 打开 https://github.com/kubernetes/minikube/releases/tag/v1.19.0 下载最新版本的二进制软件包(deb.rpm包),再使用 ...

  5. spring源码手写aop

    AOP:       aop切面编程,其实就是spring增强器的一个扩展,就是通过beanPostProcessor的after后置方式实现的,其中在after中把需要的bean通过放射+动态代理完 ...

  6. Harbor 2.1.2 安装部署

    环境 首先需要准备好 Docker + Docker-Compose 环境,Docker 在 CentOS 7.x 的安装教程请参考 这篇文章,后续文章假设你已经安装好了上述环境. 安装 标准安装 首 ...

  7. 3D模型+BI分析,打造全新的交互式3D可视化大屏开发方案

    背景介绍 在数字经济建设和数字化转型的浪潮中,数据可视化大屏已成为各行各业的必备工具.然而,传统的数据大屏往往以图表和指标为主,无法真实地反映复杂的物理世界和数据关系.为了解决这个问题,3D模型可视化 ...

  8. 单词本z launch = to throw 相关词根 lanc ject jac jet bol bl bal mit miss cast

    launch = to throw 词根 launc = lanc = to throw 表示 to throw 的词根有三组 拉丁语的lanc/launc,sip 拉丁语的ject, jac(jet ...

  9. Xmind 括号图 风格不错,挺好看的

    Xmind 括号图 风格不错,挺好看的 之前没注意到呢~ 又搞了个竖屏的,竖屏的关键点是 先隐藏第一层包括线,然后线就全部隐藏了,然后再选择要显示线的那部分,让线显示就ok了.

  10. aardio 代码格式化 自动保存 自定义 ctrl + s bug:这个快捷键是全局拦截

    aardio 代码格式化工具 https://gitee.com/pengchenggang/aardio---code-formatting-tool 修改内容 1 代码进行了一定的修改,默认ctr ...