题意:给你n个板子,初始100生命,到达每个板子加血或者扣血,求从最上面的板子落到地面的最优解

题解:对于每一个木板,只有从左下或者从右下,所以从下往上来看,到达第n个木板的最优解为 dp[n] = max(dp[l],dp[r]) + value[n]

  l 和 r 为n的左右端点下方的木板序号,然后,维护一个线段树,当一个木板计算完毕后,维护木板左端点到木板右端点的叶子节点的值为木板的序号(把下方的木板或者地板都盖住了!!)

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#define CLR(a,b) memset(a,b,sizeof(a))
using namespace std;
#define maxn 100010
int tree[maxn<<2];
int dp[maxn]; struct Node
{
int l,r,h,val;
}node[maxn]; bool cmp(Node a,Node b)
{
return a.h < b.h;
} void PushUp(int rt)
{
;
} void Build(int l,int r,int rt)
{
// cout<<l<<" "<<r<<endl;
tree[rt] = 0;
if( r == l ){
return ;
}
int m = (r+l)>>1; Build(l,m,rt<<1);
Build(m+1,r,rt<<1|1); PushUp(rt);
} void PushDown(int rt)
{
if(tree[rt]){
tree[rt<<1] = tree[rt];
tree[rt<<1|1] = tree[rt];
}
tree[rt] = 0;
} void Update(int L,int R,int c,int l,int r,int rt)
{
if( l >= L && r <= R ){
tree[rt] = c;
return ;
}
int m = (r+l)>>1;
PushDown(rt); if(L<=m) Update(L,R,c,l,m,rt<<1);
if(R>m) Update(L,R,c,m+1,r,rt<<1|1);
PushUp(rt);
} int Query(int L,int l,int r,int rt)
{
if( l == L && r == L){
return tree[rt];
}
int m = (r+l)>>1;
PushDown(rt); if(L<=m) return Query(L,l,m,rt<<1);
if(L> m) return Query(L,m+1,r,rt<<1|1);
} int main()
{
int n;
// freopen("in.txt","r",stdin);
while(scanf("%d",&n)!=EOF){
Build(1,maxn,1);
CLR(dp,0); for(int i=1;i<=n;i++)
scanf("%d%d%d%d",&node[i].h,&node[i].l,&node[i].r,&node[i].val);
sort(node+1,node+1+n,cmp); for(int i=1;i<=n;i++){ int l = Query(node[i].l,1,maxn,1);
int r = Query(node[i].r,1,maxn,1); dp[i] = max(dp[l],dp[r]) + node[i].val;
Update(node[i].l,node[i].r,i,1,maxn,1); }
dp[n]+=100;
if(dp[n]<=0)
printf("-1\n");
else
printf("%d\n",dp[n]); } return 0;
}

hdu 3016 Man Down的更多相关文章

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

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

  2. hdu 3016 dp+线段树

    Man Down Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total S ...

  3. HDU 3016 Man Down(线段树)

    HDU 3016 Man Down 题目链接 题意:是男人就下100层的游戏的简单版,每次仅仅能从两端下落.求落地最大血量 思路:利用线段树能够处理出每一个线段能来自哪几个线段.然后就是dag最长路了 ...

  4. HDU 3016 线段树区间更新+spfa

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

  5. [欧拉回路] hdu 3018 Ant Trip

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3018 Ant Trip Time Limit: 2000/1000 MS (Java/Others) ...

  6. HDOJ 2111. Saving HDU 贪心 结构体排序

    Saving HDU Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  7. 【HDU 3037】Saving Beans Lucas定理模板

    http://acm.hdu.edu.cn/showproblem.php?pid=3037 Lucas定理模板. 现在才写,noip滚粗前兆QAQ #include<cstdio> #i ...

  8. hdu 4859 海岸线 Bestcoder Round 1

    http://acm.hdu.edu.cn/showproblem.php?pid=4859 题目大意: 在一个矩形周围都是海,这个矩形中有陆地,深海和浅海.浅海是可以填成陆地的. 求最多有多少条方格 ...

  9. HDU 4569 Special equations(取模)

    Special equations Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u S ...

随机推荐

  1. Visual Studio 打开程序提示仅我的代码怎么办

    工具-->选项--->调试---->常规-->禁用"启动仅我的代码"

  2. linux修改目录为可读写

    发布到linux上遇到的问题, 上传目录没有写入权限 新建目录 mkdir /guangkuo/html/portal/images/upload 改为可读写 chmod -R a+w /guangk ...

  3. 关于FMDatabase executeQuery的问题

    如果你碰到这个问题,请查看idx的值,并查看SQL语句中第6个字段的值有问题(从0开始),比如你给的值是NSInteger会报错,需要将其转成NSString.

  4. 阿里云服务器CentOS7怎么分区格式化/挂载硬盘

    一.在阿里云上购买了服务器的硬盘后就可以操作了,先看看硬盘情况: 硬盘vda是系统盘:vdb是在阿里云后台购买的另一块硬盘. 第一次使用要分区:fdisk /dev/vdb1 在提示符下依次输入:n+ ...

  5. [转]BLAS简介

    BLAS(Basic Linear Algebra Subprograms)是一组线性代数计算中通用的基本运算操作函数集合[1] .BLAS Technical (BLAST) Forum负责规范BL ...

  6. Delphi读取不Word中不规则表格数据并转换成标准表格

    程序需要,需要将word中不规则的表格数据转换为标准的表格,即合并的单元格按正常格式解析,word中的表格格式如下: 解析后数据如下: 借鉴了网上代码,如下处理: procedure TfrmMain ...

  7. 【LeetCode】239. Sliding Window Maximum

    Sliding Window Maximum   Given an array nums, there is a sliding window of size k which is moving fr ...

  8. JavaBean之lombok

    参见:https://www.ibm.com/developerworks/cn/opensource/os-lombok/ http://blog.didispace.com/java-lombok ...

  9. C#:网络传输问题

    1.Http Post Header 中文数据值,服务端接收Header 中文数据值乱码问题: 客户端:    Encoding utf8Encoding = Encoding.GetEncoding ...

  10. 关于MYSQL ERROR1045 报错的解决办法

    **问题描述 **ERROR 1045 (28000): Access denied for user ‘root’@’localhost’ (using password: YES)或者ERROR ...