hdu 3016 dp+线段树

MFC 修改CheckBox的文本颜色方法 设置主题 这一步是必须的,不可省略。 BOOL CMFCApplication1Dlg::OnInitDialog() { CDialogEx::OnInitDialog(); // 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码 // 设置主题 HWND 阅读详情

Man Down

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2030    Accepted Submission(s): 743


Problem Description
The Game “Man Down 100 floors” is an famous and interesting game.You can enjoy the game from 
http://hi.baidu.com/abcdxyzk/blog/item/16398781b4f2a5d1bd3e1eed.html

We take a simplified version of this game. We have only two kinds of planks. One kind of the planks contains food and the other one contains nails. And if the man falls on the plank which contains food his energy will increase but if he falls on the plank which contains nails his energy will decrease. The man can only fall down vertically .We assume that the energy he can increase is unlimited and no borders exist on the left and the right.

First the man has total energy 100 and stands on the topmost plank of all. Then he can choose to go left or right to fall down. If he falls down from the position (Xi,Yi),he will fall onto the nearest plank which satisfies (xl <= xi <= xr)(xl is the leftmost position of the plank and xr is the rightmost).If no planks satisfies that, the man will fall onto the floor and he finishes his mission. But if the man’s energy is below or equal to 0 , he will die and the game is Over.

Now give you the height and position of all planks. And ask you whether the man can falls onto the floor successfully. If he can, try to calculate the maximum energy he can own when he is on the floor.(Assuming that the floor is infinite and its height is 0,and all the planks are located at different height).
 

Input
There are multiple test cases.

For each test case, The first line contains one integer N (2 <= N <= 100,000) representing the number of planks.

Then following N lines representing N planks, each line contain 4 integers (h,xl,xr,value)(h > 0, 0 < xl < xr < 100,000, -1000 <= value <= 1000), h represents the plank’s height, xl is the leftmost position of the plank and xr is the rightmost position. Value represents the energy the man will increase by( if value > 0) or decrease by( if value < 0) when he falls onto this plank.
 

Output
If the man can falls onto the floor successfully just output the maximum energy he can own when he is on the floor. But if the man can not fall down onto the floor anyway ,just output “-1”(not including the quote)
 

Sample Input
4 10 5 10 10 5 3 6 -100 4 7 11 20 2 2 1000 10
 

Sample Output
140

/*
hdu 3016 dp+线段树
感觉一直没什么思路
由于每次我们只能从两边跳下来,倒推的答案是唯一的
于是先按照高度排个序,然后就类似于叠木板,先判断当前的两端下面是哪个木板
然后取较大值再加上当前值即可
study~~~
hhh-2016-02-29 22:54:23
*/
#include <algorithm>
#include <cmath>
#include <queue>
#include <iostream>
#include <cstring>
#include <map>
using namespace std;
typedef long long ll;
const int maxn = 100050;
const int inf = 0x3f3f3f3f;
struct node
{
    int l,r,mid;
    int cov;
} tree[maxn<<2];

struct segment
{
    int l,r,h;
    int val;
    void get()
    {
        scanf("%d%d%d%d",&h,&l,&r,&val);
    }
} seg[maxn];
int dp[maxn];
bool cmp(segment a,segment b)
{
    return a.h < b.h;
}

void push_up(int r)
{
}

void build(int i,int l,int r)
{
    tree[i].l = l;
    tree[i].r = r;
    tree[i].cov = 0;
    tree[i].mid = (l +r)>>1;
    if(l == r)
    {
        return ;
    }
    build(i<<1,l,tree[i].mid);
    build(i<<1|1,tree[i].mid+1,r);
    push_up(i);
}

void push_down(int r)
{
    int lson = r<<1,rson = r<<1|1;
    if(tree[r].cov != -1)
    {
        tree[lson].cov = tree[r].cov;
        tree[rson].cov = tree[r].cov;
        tree[r].cov = -1;
    }
}

void update(int i,int l,int r,int c)
{
    if(tree[i].l >= l && tree[i].r <= r)
    {
        tree[i].cov = c;
        return ;
    }
    push_down(i);
    if(l <= tree[i].mid)
        update(i<<1,l,r,c);
    if(r > tree[i].mid)
        update(i<<1|1,l,r,c);
    push_up(i);
}

int query(int i,int k)
{
    if(tree[i].cov != -1)
    {
        return tree[i].cov;
    }
    push_down(i);
    if(k <= tree[i].mid)
        return query(i<<1,k);
    else
        return query(i<<1|1,k);
    push_up(i);
}

int main()
{
    int n;
    while(scanf("%d",&n) != EOF)
    {
        build(1,1,maxn);
        for(int i =1; i <= n; i++)
        {
            seg[i].get();
        }
        memset(dp,0,sizeof(dp));
        sort(seg+1,seg+n+1,cmp);
        int l=0,r=0;
        for(int i = 1; i <= n; i++)
        {
            if(i > 1)
            {
                l = query(1,seg[i].l);
                r = query(1,seg[i].r);
            }
            dp[i] = max(dp[l],dp[r])+seg[i].val;
            update(1,seg[i].l,seg[i].r,i);
        }
        dp[n] += 100;
        if(dp[n] <= 0)
            printf("-1\n");
        else
            printf("%d\n",dp[n]);
    }
    return 0;
}




TLF35584 窗口看门狗_理论篇 1)看门狗的结果(有效或无效触发)由相关的看门狗故障计数器独立监控。2)窗口看门狗的状态是WWO,它可能有“有效WWD触发”或“无效WWD触发”值。 阅读详情

相关推荐

Sonatype nexus3 数据迁移及升级3.71+(迁移到H2数据库)

nexus3旧版本OrientDB升级H2,及整体迁移nexus3数据到其它服务器。

葫芦娃 5550

别再自己造轮子了!Qt 6.2.3官方示例库,藏着多少能直接用的‘宝藏代码’?

本文深入探讨了Qt 6.2.3官方示例库的价值,展示了如何利用这些高质量Demo提升开发效率。从多媒体播放器到系统托盘应用,官方示例提供了可直接集成的生产级代码,帮助开发者避免重复造轮子,快速实现复杂功能。

weixin_33671935的博客 458

String+CytoScape构建PPI网络

1.下载CytoScape Cytoscape是一款专业强大好用的物生信息分析软件,主要达用于专业的研究人员使用,软件主要适用于整合模块化网络和生物科学联系网络图的绘制,支持多种文件格式,导入后就可以直接进行编辑或者分析等操作了,除此之外,软件还提供了强大的编辑工具,支持添加相应的注释信息,软件基于java环境组件打造。 下载地址:https://cytoscape.org/ 因为软件基于java...

xiaobai1_1的博客 1万+

hdu 3016 Man Down

题意:给你n个板子,初始100生命,到达每个板子加血或者扣血,求从最上面的板子落到地面的最优解 题解:对于每一个木板,只有从左下或者从右下,所以从下往上来看,到达第n个木板的最优解为 dp[n] = max(dp[l],dp[r]) + value[n]   l 和 r 为n的左右端点下方的木板序号,然后,维护一个线段树,当一个木板计算完毕后,维护木板左端点到木板右端点的叶子节点的值为木板的序...

weixin_30484739的博客 115

告别城市峡谷定位漂移:手把手教你用PSINS仿真INS/NHC/ODO组合导航(附代码获取)

本文详细解析了INS/NHC/ODO组合导航系统在城市峡谷环境中的应用,通过PSINS平台实现精准定位。文章涵盖核心原理、环境搭建、算法实现及性能优化,帮助开发者解决GNSS信号中断时的定位漂移问题,提升自动驾驶系统在复杂环境中的可靠性。

weixin_30329623的博客 429

NeurIPS‘25新研究!PINN+GNN强强联手,模型精度飙升50%!

物理图神经网络研究取得重大进展!UCLA团队提出的PhysGNN架构在NeurIPS'2025上引发关注,该模型成功融合PINN的物理约束优势与GNN的图结构处理能力,解决了工程仿真中的关键瓶颈。研究显示,PhysGNN在城市热网预测中误差降低42%,电网负荷模拟的物理规则违反率下降68%。同步解析的SyncTREE模型则创新性地将RC树物理特性融入GNN,实现毫秒级IC时序分析;HSPGNN模型通过嵌入偏微分方程,显著提升多变量时间序列填补精度。

m0_73122726的博客 1021

hdu 3016 Man Down(成段更新,单点查询)

题意:有N块木板,每块木板有四个属性,高h(h>0),左边界xl,右边界xr(0 这是一个简单的DP或者说最长路。但是木板的数目很大,如果建立每个木板到其他木板的转移用O(N^2)的复杂度,显然是会超时的,这时候,就可以借助线段树。将木板按h从小到大排序,初始时,更新线段树里的全部节点为地面的下标,然后往上添加木板的过程就是,单点查询每个木板的xl和xr,得到的下标就是当前木板能转移到的其他木板

2407

【立创EDA-PCB设计基础】1.嘉立创EDA专业版软件安装+PCB基本概念+原理图绘制

本文详解PCB基本概念以及实现MCU最小系统原理图的绘制(原理图包括MCU芯片GD32F103C8T6、外部晶振、输出端口、USB输入口、5v转3v3稳压输出、复位按键、唤醒按键、LED)及嘉立创EDA专业版软件安装。为本专栏【立创EDA-PCB设计基础】后面章节实现PCB绘制做准备。

嵌入式阿齐Archie 3万+

hdu3016 Man Down(线段树+dp)

题目链接:点击这里 题目大意: 多组输入,每组输入给出 nnn 块木板,木板高度为 hhh 左右边界分别为 l,rl,rl,r 其还有一个属性为 valvalval,玩家初始有 100100100 滴血,玩家只能从当前木板的左右边界竖直向下跳,每跳到一块木板上玩家血量就会变化 valvalval (val可能小于0) ,求从最上面的木板跳到地面玩家的最大生命值 题目分析: 首先我们要知道如何确定能从当前木板跳到哪个木板上,这个我们可以让高度从小到大用线段树做一次染色,代码中的 near[i][0],near

羊驼的博客 236

计算机组成原理(第三版)唐朔飞-第一章第二章-课后习题

计算机组成原理

weixin_45735391的博客 7万+

79-Halcon-- visualize_object_model_3d 函数功能(交互式3D可视化)

该算子是连接3D数据与决策者的关键可视化桥梁,通过其独特的交互能力和高质量的渲染效果,将复杂的3D信息转化为直观的可视内容,大幅提升工程决策效率和质量。操作符,不仅能在窗口中渲染3D对象,还支持多种交互操作,适用于调试、展示和交互分析场景。本解析将全面探讨其参数功能及工业级应用方案。+几何类型: PointCloud/ TriMesh/CAD。+法线属性: [NX,NY,NZ]+附加数据: Attributes。是Halcon中功能强大的。+顶点属性: [X,Y,Z]+颜色属性: [R,G,B]

weixin_45590420的博客 1205

HDU-3016-Man Down

这个题意类似是男人就下100层的游戏

z309241990的专栏 556

ABAP Bits and Bytes 完全参考,理解内存、字节、位运算与类型解释

ABAP开发中业务代码与底层字节处理的差异:业务层关注采购订单、会计凭证等语义信息,而接口开发需处理十六进制、位运算等底层操作。文章通过整数变量示例说明同一段字节在不同类型解释下会呈现不同值,并介绍x类型、位运算及类型转换的实际应用。这些知识在文件接口、加密传输等场景中尤为重要,开发者需注意字节序、编码等问题。建议将底层协议处理与业务逻辑分离,以保持代码清晰和可维护性。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 142

hdu3016 线段树+简单DP

看题目都看了半天,各种小条件,看了网上的思路才算把题目理解清楚了,主要是先按高度排序,再用线段树从下到上记录每块木板左右两边能跳到的id。然后从上到下作DP。中途能量不能小于1. ACcode: #include #include #include using std::sort; const int nsize=111111; const int INF=100000000; i

丿Smilē 丶晨星灬 984

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

hdu 3016(线段树+dp)

看了别人的博客才AC的。 这题以dp为主要,线段树打辅助,线段树为后面的dp做铺垫! 首先想怎么dp: 1、建立一个结构体 struct plank{ int h , l , r, value;//木板本身的属性,高度、左端点、右端点、值 int vl , vr; //从木板左边跳到vl木板 , 右边跳到vr木板 plank(int H = 0, int L = 0, int R =

不戚的专栏 921

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【HDU】3016 Man Down 线段树DP

传送门:【HDU】3016 Man Down 题目分析:今天看tu

poursoul 1213

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

HDU 3016 线段树+简单dp

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=3016         #include #include #include #include using namespace std; struct Board { int h; int l; int r; int v; }; struct Line {

仰望圣光的plusplus7 657

HDU 3016 线段树单点更新+DP

【题目链接】 http://acm.hdu.edu.cn/showproblem.php?pid=3016 【解题报告】 这道题目把线段树和DP结合起来了,所以并没有思路。参考了一篇题解,觉得讲的非常好: http://www.cnblogs.com/scau20110726/archive/2013/05/11/3073398.html –Titanium 这里面有一

gungnir0711的博客 517

hdu 3016 Man Down 线段树+dp

这题的思路是:将板子根据高度从低到高排序。用线段树找到当前木板的左边和右边的下一个木板的id,不断覆盖新的木板。 然后用dp[i]表示在第i个木板的最大能量,根据找到的visl和visr不断下跳,找到最优解。 由于做题注意力不集中和对线段树不够熟悉。出现了3个错误,找了我好久,太粗心了。 #include #include #include using namespace std; #de

dimhat的专栏 693

hdu 3016 线段树+dp

用线段树由低到高覆盖每一层台阶的长度,根据线段左右两端连边,然后由高到底DP即可 #include <stdio.h> #include <algorithm> using namespace std; const int maxn= 200001; const int mincost=-200000000; struct Pool { int ...

weixin_30781433的博客 94

hdu 3016(线段树+dp)

题意:有n个木板,给出每个木板的左右端点坐标高度,还有每个木板的能量值,一个人初始能力100,从最高的木板开始,每下落到一个木板,得到这个木板的能量值,然后通过这个木板的左右移动到下一个木板,问落到横坐标为0的时候,最大能量值是多少。 题解:因为每个木板的左右端点可以确定下一个木板,明显可以用dp来从最高到最低的得出最大值,可是这里木板有100000个,可以借助线段树来维护每个木板通过左右端点到的

俯瞰风景 590

HDU-3016:Man Down(线段树+DP)

HDU-3016:Man Down(线段树+DP) 简单线段树区间更新和简单dp

污miao汪的博客 379

HDU 3016 Man Down(线段树区间单点查询+DP)

http://acm.hdu.edu.cn/showproblem.php?pid=3016题意: 是男人就下100层。这个男人开始在最顶层,并且拥有100的能量,如果他能下到他下面的横木上,他将无条件获得横木的val。他只能从横木的左端点和右端点下落。要是中途他的能量小于或等于0,he will die~解题思路:要求到达最后一层的能量最大值,显然要用DP。一开始自然而然能够想到将这些横木按照从大

我要加油了,因为我还有很多NB的梦想! 786

HDU 3016 Man Down(线段树 + DP)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3016 题意:一个人从高处往下垂直下落,每次可以从该木板的两端下落到最近的且包含该端点的木板上,一开始血量为100,跳到某个木板上可能回血或扣血,当血量 <= 0时该游戏结束,问跳到地面血量最多为多少 思路:首先要考虑如何寻找下次能跳的最近的左右两木板这一问题,我们可以将木板升序排...

Tongqi 581

hdu 3016(线段树 + DP)

题意:一个游戏(做题前可以先玩一下帮助理解)。题意比游戏简易:每个木板都有一个权值,可正可负或0,人在上面,自身能量要加上这个权值(即能量会发生增减)。人一开始有100能量,站在最高的木板上(要加上这个能量的权,所以其实起始能量应该为100+该板能量)。然后人往下跳,跳法有讲究并不像真实游戏那样可以移动,人下落,只能从一块木板的端点垂直下落,中途不能移动,这和实际游戏有区别,但是也使问题...

weixin_30318645的博客 77
上一篇: hdu 1394 线段树
下一篇: hdu 4288 离线线段树+间隔求和
Tyuio28
博客等级 码龄11年 12粉丝 279原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值