hdu 3016 Man Down (线段树 + dp)
来源:互联网 发布:2016淘宝盗图处罚规则 编辑:程序博客网 时间:2024/05/22 09:58
题目大意:
是男人就下一般层。。。没什么可以多说的吧。
注意只能垂直下落。
思路分析:
后面求最大值的过程很容易想到是一个dp的过程 。
因为每一个plane 都只能从左边 从右边下两种状态。
然后我们所需要处理的问题就是 ,你如何能快速知道往左边下到哪里,往右边下到哪里。
这就是线段树的预处理。
讲线段按照高度排序。
然后按照高度从小到大加入到树中。
然后去寻找左端点 和 右端点最近覆盖的线段的编号。
#include <cstdio>#include <iostream>#include <cstring>#include <algorithm>#define lson num<<1,s,mid#define rson num<<1|1,mid+1,e#define mid ((s+e)>>1)#define maxn 100005using namespace std;struct Line{ int h,st,ed,v; bool operator < (const Line &cmp)const { return h<cmp.h; }}scline[maxn];int cov[maxn<<2];int ldn[maxn];int rdn[maxn];void pushdown(int num){ if(cov[num]) { cov[num<<1]=cov[num<<1|1]=cov[num]; cov[num]=0; }}int query(int num,int s,int e,int pos){ if(cov[num])return cov[num]; if(s==e)return 0; if(pos<=mid)return query(lson,pos); else return query(rson,pos);}void update(int num,int s,int e,int l,int r,int val){ if(l<=s && r>=e){ cov[num]=val; return; } pushdown(num); if(l<=mid)update(lson,l,r,val); if(r>mid)update(rson,l,r,val);}int dp[maxn];int main(){ int n; while(scanf("%d",&n)!=EOF) { int m=0;n++; scline[1].h=0,scline[1].st=1,scline[1].ed=maxn-1,scline[1].v=0; for(int i=2;i<=n;i++) { scanf("%d%d%d%d",&scline[i].h,&scline[i].st,&scline[i].ed,&scline[i].v); } m=maxn-1; sort(scline+1,scline+1+n); memset(cov,0,sizeof cov); for(int i=1;i<=n;i++) { ldn[i]=query(1,1,m,scline[i].st); rdn[i]=query(1,1,m,scline[i].ed); update(1,1,m,scline[i].st,scline[i].ed,i); } for(int i=1;i<maxn;i++)dp[i]=-0x3f3f3f3f; dp[n]=100+scline[n].v; for(int i=n;i>=1;i--) { if(dp[i]>0)dp[ldn[i]]=max(dp[ldn[i]],dp[i]+scline[ldn[i]].v); if(dp[i]>0)dp[rdn[i]]=max(dp[rdn[i]],dp[i]+scline[rdn[i]].v); } if(dp[1]>0)printf("%d\n",dp[1]); else puts("-1"); } return 0;}
0 0
- hdu 3016 Man Down 线段树+dp
- hdu 3016 Man Down (线段树 + dp)
- 【HDU】3016 Man Down 线段树DP
- Hdu 3016 Man Down【线段树+Dp】
- HDU-3016:Man Down(线段树+DP)
- HDU 3016 Man Down (线段树+dp)
- hdu 3016 Man Down(简单线段树&简单DP)
- hdu(3016) Man Down(线段树查询更新+dp)
- HDU 3016 Man Down(线段树 + DP)
- HDU 3016 Man Down(线段树区间单点查询+DP)
- hdu 3016 Man Down(线段树区间更新+dp)
- HDU 3016 Man Down(线段树+离散化+dp)
- hdu 3016 Man Down(线段树)
- hdu 3016 Man Down(线段树)
- HDU 3016 Man Down(线段树)
- hdu-3016-Man Down(线段树)
- Man Down(线段树+区间更新+单点查询+dp)
- hdu 3016 Man Down
- RQNOJ-36 数石子
- VB导出Excel
- HDU 1358——Period(KMP 失配函数)
- hd 2090 ny 316 算菜价
- NYOJ 56 阶乘因式分解
- hdu 3016 Man Down (线段树 + dp)
- 字典树数组实现
- 基于V8引擎的C++和JS的相互交互
- 编译C++ 程序的过程
- 常用的不可变的字符串处理的实例方法 API文档 NSString
- jquery中获取id值方法
- 非阻塞式socket编程
- 树状数组
- POJ 1006 ( 中国剩余定理 )