hdu 3016 Man Down

来源:互联网 发布:mysql select as 用法 编辑:程序博客网 时间:2024/05/21 21:39

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3016

题目大意:一个男人从在最上面的木板开始往下跳,他只可以从木板的最左端或最右端处直线下跳.假设从xi跳,那么他会落在当前木板的高度以下的某块木板(左端点为xl,右端点为xr),该木板满足xl<=xi<=xr,并且获得该木板的能量(能量可负),如果没有满足的木板,便成功落地.一开始男人有100点能量,如果中途能量不大于零表示落地失败.判断能否成功落地,能成功落地输出能获得的最大能量.

思路:
dp[cur]=max(dp[i],...,dp[j])(a[]为木板,a[i]...a[j],为可直接落到a[cur]的木板,dp[x]表示落到x木板时的最大能量),max(dp[i]...dp[j])用线段树求.

代码:

#include <stdlib.h>#include <string.h>#include <stdio.h>#include <ctype.h>#include <math.h>#include <time.h>#include <stack>#include <queue>#include <map>#include <set>#include <vector>#include <string>#include <iostream>#include <algorithm>using namespace std;#define ull unsigned __int64#define ll __int64//#define ull unsigned long long//#define ll long long#define lson l,mid,rt<<1#define rson mid+1,r,rt<<1|1#define middle (l+r)>>1#define MOD 1000000007#define esp (1e-4)const int INF=0x3F3F3F3F;const double DINF=10001.00;//const double pi=acos(-1.0);const int N=100010;int n,m;int mmax[N<<2],cov[N<<2];struct node{int h,l,r,c;bool operator < (const node& p) const {return h > p.h;}}a[N];void func(int rt,int c){mmax[rt]=cov[rt]=c;}void PushDown(int rt){if(cov[rt]){func(rt<<1,cov[rt]);func(rt<<1|1,cov[rt]);cov[rt]=0;}}void PushUp(int rt){mmax[rt]=max(mmax[rt<<1],mmax[rt<<1|1]);}void Update(int l,int r,int rt,int L,int R,int c){if(L<= l && r<=R){func(rt,c);return;}PushDown(rt);int mid=middle;if(L<=mid) Update(lson,L,R,c);if(mid<R) Update(rson,L,R,c);PushUp(rt);}int Query(int l,int r,int rt,int L,int R){if(L<=l && r<=R) return mmax[rt];PushDown(rt);int mid=middle,ret=0;if(L<=mid) ret=max(ret,Query(lson,L,R));if(mid<R) ret=max(ret,Query(rson,L,R));return ret;}int main(){//freopen("1.in","r",stdin);//freopen("1.out","w",stdout);int i,j,k,tmp,ret;//int T,cas;scanf("%d",&T);for(cas=1;cas<=T;cas++)while(~scanf("%d",&n)){for(i=m=0;i<n;i++){scanf("%d%d%d%d",&a[i].h,&a[i].l,&a[i].r,&a[i].c);m=max(m,a[i].r);}sort(a,a+n);memset(cov,0,sizeof(cov));memset(mmax,0,sizeof(mmax));Update(1,m,1,a[0].l,a[0].l,100+a[0].c);Update(1,m,1,a[0].r,a[0].r,100+a[0].c);for(i=1;i<n;i++){tmp=Query(1,m,1,a[i].l,a[i].r);if(tmp>0){Update(1,m,1,a[i].l,a[i].r,-1);Update(1,m,1,a[i].l,a[i].l,tmp+a[i].c);Update(1,m,1,a[i].r,a[i].r,tmp+a[i].c);}}printf("%d\n",mmax[1]>0? mmax[1]:-1);}return 0;}


原创粉丝点击