题意:从左往右跳箱子,每个箱子有金币数量,只能从矮处向高处跳,求最大可获得金币数,数据规模1<=n<=1e5.

显然是一个dp的问题,不难得出dp[ i ] = max(dp[j] )+val [ i ] ,j < i ; 第一眼会想到o(n^2)的算法,显然会超时,这个时候就需要用线段树维护最大值,将复杂度降低到o(nlogn)

首先离散化处理,将高度从小到大排序,并使用unique函数去重,之后每个高度就可以映射为它的下标pos,然后用线段树维护每个下标对应的最优解bestans [ pos ] ,每当向后进行新的决策时,

先找出状态转移方程中的max( dp [ j ] ) ,线段树操作是o(logn)的,然后用dp [ i ] = max( dp [ j ])+val[ i ] 更新线段树中 ( h[ i ] 对应下标pos ) bestans[ pos ] 的值

#include<bits/stdc++.h>
#define N 100050
#define debug cout<<"???"<<endl;
using namespace std;
int val[N],mx[N<<],h[N];
void pushup(int rt)
{
mx[rt]=max(mx[rt<<],mx[rt<<|]);
}
int query(int L,int R,int l,int r,int rt)
{
if(L>R)return ;
if(L<=l&&r<=R)return mx[rt];
int m=(l+r)>>;
int ans=;
if(L<=m)ans=max(ans,query(L,R,l,m,rt<<));
if(R>m)ans=max(ans,query(L,R,m+,r,rt<<|));
return ans;
}
void updata(int pos,int val,int l,int r,int rt)
{
if(l==r){
mx[rt]=val;
return;
}
int m=(l+r)>>;
if(pos<=m)updata(pos,val,l,m,rt<<);
if(pos>m)updata(pos,val,m+,r,rt<<|);
pushup(rt);
}
void init()
{
memset(mx,, sizeof(mx));
}
int main()
{
int n,x;
while(cin>>n) {
init();
vector<int>ve;
for (int i = ; i <= n; i++) {
scanf("%d%d",&h[i],val+i);
ve.emplace_back(h[i]);
}
int ans=;
sort(ve.begin(),ve.end());
unique(ve.begin(),ve.end());
for(int i=;i<=n;i++)
{
int pos=int(lower_bound(ve.begin(),ve.end(),h[i])-ve.begin()+);
int tmp=query(,pos-,,int(ve.size()),);
updata(pos,tmp+val[i],,int(ve.size()),);
ans=max(ans,tmp+val[i]);
}
cout<<ans<<endl;
}
return ;
}

HDU 3607 线段树+DP+离散化的更多相关文章

  1. hdu 4419 线段树 扫描线 离散化 矩形面积

    //离散化 + 扫描线 + 线段树 //这个线段树跟平常不太一样的地方在于记录了区间两个信息,len[i]表示颜色为i的被覆盖的长度为len[i], num[i]表示颜色i 『完全』覆盖了该区间几层. ...

  2. hdu 4747 线段树/DP

    先是线段树 可以知道mex(i,i),mex(i,i+1)到mex(i,n)是递增的. 首先很容易求得mex(1,1),mex(1,2)......mex(1,n) 因为上述n个数是递增的. 然后使用 ...

  3. HDU 5726 线段树+dp

    题意:给出一个序列,后q次询问,求给定区间gcd及整个序列有多少个序列的gcd和这个值相同 首先线段树维护区间gcd建树,之后预处理出每个gcd有多少个子序列,这时需要dp, dp[i][tmp]表示 ...

  4. hdu 4288 线段树+离线+离散化

    http://acm.hdu.edu.cn/showproblem.php?pid=4288 開始的时候,果断TLE,做的方法是,线段树上只维护%5==3的坐标,比方1 2 3 4 5 6 7  假设 ...

  5. 覆盖的面积 HDU - 1255 线段树+扫描线+离散化 求特定交叉面积

    #include<cstdio> #include<map> #include<algorithm> using namespace std; ; struct N ...

  6. HDU 1542 线段树+扫描线+离散化

    Atlantis Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

  7. HDU 3016 Man Down (线段树+dp)

    HDU 3016 Man Down (线段树+dp) Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Ja ...

  8. hdu 5877 线段树(2016 ACM/ICPC Asia Regional Dalian Online)

    Weak Pair Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total ...

  9. hdu 1542 线段树扫描(面积)

    Atlantis Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

随机推荐

  1. Sql生成 Insert 语句

    declare @TableName sysname select @TableName = 'T_OOSOrder' declare @result varchar(max) = 'INSERT I ...

  2. VMware Workstation 无法打开内核设备:\\Global\\vmx86

    解决方法:win10系统,打开“服务”后右击选择使用管理员打开.然后在一大串服务中找到vm开头的服务项,全部都启动.重新启动vm就ok了(vm需要以管理员身份打开).不用复杂的代码!!

  3. git 强制取消本地修改

    本地的项目中修改不做保存操作,可以用到Git pull的强制覆盖,具体代码如下: git fetch --allgit reset --hard origin/master git fetch 指令是 ...

  4. Linux操作基础

    摘要 一.Linux操作系统概述 二.Linux操作系统安装 三.Linux文件系统及文件基础 四.Linux操作系统命令使用基础 五.Linux应用程序的安装与卸载基础 五.用户及进程 六.相关信息 ...

  5. Error:ORA-00937: 非单组分组函数错误

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/istend/article/details/34429721 ORA-00937: 非单组分组函数错 ...

  6. pytest----fixture(1)--使用fixture执行配置及销毁逻辑

    1使用fixture执行配 置及销毁;非常灵活 使用. 2数据共享:在 conftest.py配置里写方 法可以实现数据共享, 不需要import导入.可 以跨文件共享 3scope的层次及神 奇的y ...

  7. js 万能判断

    console.log(Object.prototype.toString.call(123)) //[object Number] console.log(Object.prototype.toSt ...

  8. whatis - 在 whatis 数据库里查找完整的单词

    总览 (SYNOPSIS) whatis keyword ... 描述 (DESCRIPTION) whatis 命令在一些特定的包含系统命令的简短描述的数据库文件里查找关键字, 然后把结果送到标准输 ...

  9. Linux 进程间通信 信号灯集

    1.特点:  信号灯集,是控制访问临界资源 信号灯(semaphore),也叫信号量.它是不同进程间或一个给定进程内部不同线程间同步的机制System V的信号灯是一个或者多个信号灯的一个集合(允许对 ...

  10. 读书笔记二、ndarray的数据类型

    dtype(数据类型)是一个特殊的对象,它含有ndarray将一块内存解释为特定数据类型所需的信息: import numpy as np arr1=np.array([1,2,3],dtype=np ...