题目

将\(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. Aop @AfterReturning因返回类型不一致导致无法执行切面代码

    要做返回异常之后,所有操作回滚的操作,本来想着泛型用 Object 就表示所有返回类型是 CommonResult 并且加指定注解的都走这个通知的代码,但是如下配置,无论如何也不生效 进入源码里发现, ...

  2. vue upload 图片转base64、转二进制数组,保存编码数据到文件

    功能需求 1.图片转base64 2.base 64 转二进制数组 3.保存二进制数据到文件下载到本地 解决方法 问题1: 参考资料 vue element upload图片 转换成base64 具体 ...

  3. 【Azure Logic App】使用Outlook.com发送邮件遇到429报错

    问题描述 在Logic App中使用 Outlook.com组件发送邮件,遇见了outlook connection报429的错误 {"error":{"code&quo ...

  4. 当 GraphQL 遇上图数据库,便有了更方便查询数据的方式

    人之初,性本鸽. 大家好,我叫储惠龙(实名上网),你可以叫我小龙人,00 后一枚.目前从事后端开发工作. 今天给大家带来一个简单的为 NebulaGraph 提供 GraphQL 查询支持的 DEMO ...

  5. DataX 离线跨网场景的实施配置

    配置仅限于跨不同网情况,网络互通情况方案和配置会更简单一点 内网A:MySql数据转换成Csv { "job": { "setting": { "sp ...

  6. Codeforces Round 924 (Div. 2)B. Equalize(思维+双指针)

    目录 题面 链接 题意 题解 代码 题面 链接 B. Equalize 题意 给一个数组\(a\),然后让你给这个数组加上一个排列,求出现最多的次数 题解 赛时没过不应该. 最开始很容易想到要去重,因 ...

  7. Swoft - Bean

    一.Bean 在 Swoft 中,一个 Bean 就是一个类的一个对象实例. 它(Bean)是通过容器来存放和管理整个生命周期的. 最直观的感受就是省去了频繁new的过程,节省了资源的开销. 二.Be ...

  8. modalError.vue 错误提示框 vue2 iview

    需求 一个错误提示框,后台需要有换行,默认没有换行,做一个支持换行的全局错误提示函数. 注意 代码只展示原理,直接不能使用,里面有getAc,有需要参考 https://www.cnblogs.com ...

  9. 单词本z custom cu = com 一起 都, st=suet 自己, om 尾缀, 都是自己身上的 = 习惯,习俗

    单词本z custom cu = com 一起 都, st=suet 自己, om 尾缀, 都是自己身上的 = 习惯,习俗 custom 来自拉丁语 consuetus cu = com st = s ...

  10. Vue mixin 永远不要用!! 极品垃圾,后期维护就剩骂街了~!!

    为什么 Vue mixin 永远不要用!! 极品垃圾,后期维护就剩骂街了~!! vscode 没有自动跳转 自己维护下看看,重构的时候,还得整个复写,相当于整个软件重写 F!!!