题目

将\(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. 单表查询,多表查询,子查询---day37

    1.单表查询 # ### part1 单表查询 # sql 查询语句的完整语法 '''select..from..where..group by..having..order by..limit..' ...

  2. 【LeetCode数组#4滑动窗口】长度最小的子数组+子数组最大平均数I

    长度最小的子数组 力扣题目链接(opens new window) 给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度.如果不存 ...

  3. UserWarning: To get the last learning rate computed by the scheduler, please use `get_last_lr()`

    将 lr = scheduler.get_lr() 改为 lr = scheduler.get_last_lr()

  4. 7、zookeeper应用场景-分布式锁

    分布式锁 实现原理:有序节点+watch监听机制实现 分布式锁有多种实现方式,比如通过数据库.redis都可实现.作为分布式协同工具Zookeeper,当然也有着标准的实现方式.下面介绍在zookee ...

  5. 机器学习从入门到放弃:卷积神经网络CNN(二)

    一.前言 通过上一篇文章,我们大概了解了卷积是什么,并且分析了为什么卷积能在图像识别上起到巨大的作用.接下来,废话不多话,我们自己尝试动手搭建一个简易的CNN网络. 二.准备工作 在开始的时候,我们首 ...

  6. Asp .Net Web Forms 系列:配置图片防盗链的几种方法

    通过 URL Rewrite Module 组件 URL Rewrite Module 是一个用于在 ASP.NET Web Forms 或其他基于 IIS 的 Web 应用程序中重写 URL 的强大 ...

  7. vscode 快速切换窗口 快捷键 设置成 Alt + Q 了

    vscode 切换窗口 快捷键 设置成 Alt + Q 了 又换了 换成 快速切换窗口了 quickSwitchWindow 这样方便了 我再感受下一

  8. 用json画图的画图软件 推荐 Balsamiq

    看这个库的时候发现的的这个软件 https://github.com/ironman1987/chinese-developer-roadmap 下载:https://www.zdfans.com/h ...

  9. 蓝牙BLE无线控制氛围灯解决方案之特色解析

    谁的方案?   前几天和一个小伙伴讨论方案公司的价值,他给出定位还是比较准确地,作为一家方案公司,就是让产品公司,低成本,快速的推出具有市场竞争力的产品.凭借着本团队在无线蓝牙领域的深耕,这些年也做了 ...

  10. ijkplayer编译-RTSP

    1.编译平台和版本 使用操作系统 Ubuntu 18.04 使用ndk版本:android-ndk-r14b-linux-x86_64.zip (使用r17c编译会报错) AS版本:4.2.2 1.1 ...