#dp、树状数组#JZOJ 3859 孤独一生
题目
将\(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 孤独一生的更多相关文章
- 树形DP+树状数组 HDU 5877 Weak Pair
//树形DP+树状数组 HDU 5877 Weak Pair // 思路:用树状数组每次加k/a[i],每个节点ans+=Sum(a[i]) 表示每次加大于等于a[i]的值 // 这道题要离散化 #i ...
- bzoj 1264 [AHOI2006]基因匹配Match(DP+树状数组)
1264: [AHOI2006]基因匹配Match Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 793 Solved: 503[Submit][S ...
- 【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 ...
- 奶牛抗议 DP 树状数组
奶牛抗议 DP 树状数组 USACO的题太猛了 容易想到\(DP\),设\(f[i]\)表示为在第\(i\)位时方案数,转移方程: \[ f[i]=\sum f[j]\;(j< i,sum[i] ...
- codeforces 597C C. Subsequences(dp+树状数组)
题目链接: C. Subsequences time limit per test 1 second memory limit per test 256 megabytes input standar ...
- HDU 2227 Find the nondecreasing subsequences (DP+树状数组+离散化)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2227 Find the nondecreasing subsequences ...
- ccpc_南阳 C The Battle of chibi dp + 树状数组
题意:给你一个n个数的序列,要求从中找出含m个数的严格递增子序列,求能找出多少种不同的方案 dp[i][j]表示以第i个数结尾,形成的严格递增子序列长度为j的方案数 那么最终的答案应该就是sigma( ...
- HDU 2838 (DP+树状数组维护带权排序)
Reference: http://blog.csdn.net/me4546/article/details/6333225 题目链接: http://acm.hdu.edu.cn/showprobl ...
- [poj3378] Crazy Thairs (DP + 树状数组维护 + 高精度)
树状数组维护DP + 高精度 Description These days, Sempr is crazed on one problem named Crazy Thair. Given N (1 ...
- HDU 2836 Traversal 简单DP + 树状数组
题意:给你一个序列,问相邻两数高度差绝对值小于等于H的子序列有多少个. dp[i]表示以i为结尾的子序列有多少,易知状态转移方程为:dp[i] = sum( dp[j] ) + 1;( abs( he ...
随机推荐
- 2021-09-15 JavaScript中强制将某个未知类型变量转成基础数据类型
为什么要强制将某个未知类型变量转成基础数据类型? 实际业务场景里,一个变量的数据是否合法或符合预期,会影响到自己的代码的可靠性.比如在别人使用自己写的自定义函数,而自己写的函数中的一些值是需要对入参严 ...
- Java JVM——7.本地方法栈
本地方法栈 Java虚拟机栈于管理Java方法的调用,而本地方法栈用于管理本地方法的调用. 本地方法栈,也是线程私有的. 允许被实现成固定或者是可动态扩展的内存大小.(在内存溢出方面是相同的) ✎ 如 ...
- error接口
// 实际上它是interface类型,这个类型有一个返回错误信息的单一方法: type error interface{ Error() string } 创建一个error最简单的方法就是调用er ...
- Elasticsearch下载安装配置
下载地址 # elasticsearch https://www.elastic.co/cn/downloads/past-releases/elasticsearch-6-8-3 # kibana ...
- 【Azure 应用服务】在Azure App Service for Windows 中部署Java/NodeJS/Python项目时,web.config的配置模板内容
问题描述 在Azure App Service for Windows 中部署web项目时候,需要在wwwroot下设置web.config,对于不同语言的项目,web.config文件中的httpP ...
- 【Azure API 管理】APIM添加Log-to-eventhub的策略后,一些相关APIM与Event Hub的问题
问题描述 1) APIM 到Event Hub 写入日志是否有数量限制,比如每秒最大写入数量: 2) 是否可以在同一个APIM配置多个Event Hub,如果可以该APIM写入日志的峰值是 ...
- 【Azure 存储服务】Azure Blob下面是否可以创建子文件夹
问题描述 如何在Azure Storage Account(存储账户) 门户上为 Container 创建子文件夹? 问题解决 经验证,没有办法在门户上直接创建文件夹,不过可以使用Azure Stor ...
- C笔记(2014-12备份)
Video1: 1-编译器对待全局变量和局部变量的差别.全局变量分配空间是在数据区,局部变量分配在代码区. (比如局部变量 int lo_var = 2;后面的 = 2;是赋值语句,被编译器转化成机器 ...
- NebulaGraph v3.3.0 发布:支持子图过滤、和大量性能优化
NebulaGraph 3.3.0 支持了 GET SUBGRAPH 和 GetNeighbors 的点过滤.引入了大量性能优化,同时,开始对无 tag 顶点的支持默认关闭. 优化 优化了 k-hop ...
- 手把手教你蜂鸟e203协处理器的扩展
NICE协处理器 赛题要求: 对蜂鸟E203 RISC-V内核进行运算算子(譬如加解密算法.浮点运算.矢量运算等)的扩展,可通过NICE协处理器接口进行添加,也可直接实现RISC-V指令子集(譬如 ...