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 ...
随机推荐
- Python多线程案例
from time import ctime,sleep import threading def music(): for i in range(2): print ("I was lis ...
- 利用yield 实现Xrange功能
def xrange(n): start = 0 while True: if start>n: return yield start start+=1 obj = xrange(5) n1 = ...
- android使用sharesdk的小感
1.sharesdk快捷方式,快捷方式集成了所有需要分享到的手机app,但是具有缺陷,举个例子(想要微信分享图片url,但是短信并不想带有图片,否则短信成彩信,这里集成的就有麻烦了,为了解决这种问题, ...
- Flask 蓝图(Blueprint)
蓝图使用起来就像应用当中的子应用一样,可以有自己的模板,静态目录,有自己的视图函数和URL规则,蓝图之间互相不影响.但是它们又属于应用中,可以共享应用的配置.对于大型应用来说,我们可以通过添加蓝图来扩 ...
- Echarts柱状图实现不同颜色渐变色
第一次写文,只是想记录一下自己平时发现的小功能,这篇主要是实现echarts柱状图,每个柱子实现不同颜色的渐变色,也是第一次接触echarts,后台使用ssm,前台是extjs,直接上效果图 直接上j ...
- mint-ui在vue中的使用。
首先放上mint-ui中文文档 近来在使用mint-ui,发现部分插件在讲解上并不是很详细,部分实例找不到使用的代码.github上面的分享,里面都是markdown文件,内容就是网上的文档 刚好自己 ...
- 用python实现与小米网关通讯
python 与小米网关通讯的三块内容: 以下内容的理解需要配合<绿米网关局域网通讯协议>使用 1.监听网关发出的组播信息:(有网关及连接设备的生命信号,事件信息) 2.读取需要获得的信息 ...
- 剑指offer-二叉树中和为某一值的路径
题目描述 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径. 解题思路 利用前序遍历的思想,定义FindP ...
- python网络爬虫与信息提取 学习笔记day3
Day3: 只需两行代码解析html或xml信息 具体代码实现:day3_1 注意BeautifulSoup的B和S需要大写,因为python大小写敏感 import requests r ...
- 05_Linux目录文件操作命令2_我的Linux之路
这一节我们继续来学习Linux中对文件和目录的操作命令 mkdir 创建目录 mkdir (选项)(参数) 在Linux端可以使用mkdir来创建目录,如果你没有加其他的路径名,那么默认是在当前目录下 ...