hdu 3016 dp+线段树
Man Down
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2030 Accepted Submission(s): 743
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).
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.
10 5 10 10
5 3 6 -100
4 7 11 20
2 2 1000 10
- /*
- 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;
- }
hdu 3016 dp+线段树的更多相关文章
- HDU 3698 DP+线段树
给出N*M矩阵.每一个点建立灯塔有花费.每一个点的灯塔有连接范围,求每一行都建立一个灯塔的最小花费,要求每相邻两行的灯塔能够互相连接.满足 |j-k|≤f(i,j)+f(i+1,k) DP思路,dp[ ...
- ZOJ 3349 Special Subsequence 简单DP + 线段树
同 HDU 2836 只不过改成了求最长子串. DP+线段树单点修改+区间查最值. #include <cstdio> #include <cstring> #include ...
- hdu 4031 attack 线段树区间更新
Attack Time Limit: 5000/3000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Others)Total Subm ...
- hdu 4288 离线线段树+间隔求和
Coder Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Su ...
- cf834D(dp+线段树区间最值,区间更新)
题目链接: http://codeforces.com/contest/834/problem/D 题意: 每个数字代表一种颜色, 一个区间的美丽度为其中颜色的种数, 给出一个有 n 个元素的数组, ...
- Codeforces Round #620 F2. Animal Observation (hard version) (dp + 线段树)
Codeforces Round #620 F2. Animal Observation (hard version) (dp + 线段树) 题目链接 题意 给定一个nm的矩阵,每行取2k的矩阵,求总 ...
- 题解 HDU 3698 Let the light guide us Dp + 线段树优化
http://acm.hdu.edu.cn/showproblem.php?pid=3698 Let the light guide us Time Limit: 5000/2000 MS (Java ...
- HDU 4719 Oh My Holy FFF(DP+线段树)(2013 ACM/ICPC Asia Regional Online ―― Warmup2)
Description N soldiers from the famous "*FFF* army" is standing in a line, from left to ri ...
- HDU 3698 Let the light guide us(DP+线段树)(2010 Asia Fuzhou Regional Contest)
Description Plain of despair was once an ancient battlefield where those brave spirits had rested in ...
随机推荐
- TSP-旅行商问题
#include <iostream> #include <vector> #include <algorithm> using namespace std; in ...
- django的模板(二)
模板(二) 实验简介 本节继续介绍模板的常用标签,for.if.ifequal和注释标签. 一.基本的模板标签和过滤器 1. 标签 if/else {% if %} 标签检查(evaluate)一个变 ...
- 使用 PHP 来做 Vue.js 的 SSR 服务端渲染
对于客户端应用来说,服务端渲染是一个热门话题.然而不幸的是,这并不是一件容易的事,尤其是对于不用 Node.js 环境开发的人来说. 我发布了两个库让 PHP 从服务端渲染成为可能.spatie/se ...
- 同样是IT培训,为什么人家月薪过万,你才几千,问题在哪?!
听过一句话"360行,行行转IT",虽然有些夸张,但也不难看出IT行业的火爆程度.从李总理提的"互联网+大数据"开始,中国的这场"互联网+" ...
- day-6 机器学习概念及应用
学习玩Python基础语法,今天开始进行机器学习,首先了解下机器学习和深度学习的一些基本概念和术语: 1. 机器学习概念及应用 2. 深度学习概念及应用 3. 机器学习基本术语及举例 4. 机 ...
- python之路--day10-闭包函数
1.命名关键字参数 格式:在*后面的参数都是命名关键字参数 特点: 1.必须被传值 2.约束函数的调用者必须按照key=value的形式传值 3.约束函数的调用者必须用我们指定的key名 def au ...
- 策略模式(Stratety)
namespace StrategyPattern //策略模式 { /// <summary> /// 定义所以支持的算法的公共接口 /// </summary> abstr ...
- Oracle数据库游标精解
游标 定义:标识结果集中数据行的一种容器(CURSOR),游标允许应用程序对查询语句返回的行结果集中的每一行进行相同或不同的操作,而不是一次对整个结果集进行同一种操作.实际上是一种能从包括多条数据记录 ...
- js判断操作系统windows,ios,android(笔记)
使用JS判断用户使用的系统是利用浏览器的userAgent. navigator.userAgent:userAgent 获取了浏览器用于 HTTP 请求的用户代理头的值. navigator.pla ...
- Window7系统下安装jdk
根据电脑的操作系统下载相对于的jdk版本(32位或64位),我安装的是:java_jdk1.7 [计算机]——[属性]——[高级系统设置]——高级——[环境变量] 系统变量——>新建JAVA_H ...