hdu 3016线段树之七
来源:互联网 发布:nodejs 遍历json对象 编辑:程序博客网 时间:2024/05/20 15:10
对每一个木板,用线段树去找它左边和右边能到达到的木板的编号:
最后dp:
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;struct p{ int l; int r; int n; int mark;} tree[444444];struct pp{ int ln; int rn; int l; int r; int v; int h;} s[111111];void build(int n,int l,int r){ tree[n].l = l; tree[n].r = r; tree[n].mark =0; tree[n].n = -1; if(l == r) return ; int mid = (l+r)/2; build(n*2,l,mid); build(n*2+1,mid+1,r);}void update(int n,int l,int r,int k){ if(tree[n].l == l&&tree[n].r == r) { tree[n].mark = 1; tree[n].n = k; return ; } int mid = (tree[n].l + tree[n].r)/2; if(tree[n].mark!=0) { tree[n*2].mark = tree[n*2+1].mark = tree[n].mark; tree[n*2].n = tree[n*2+1].n = tree[n].n; tree[n].mark=0; } if(r<=mid) { update(n*2,l,r,k); } else if(l>mid) { update(n*2+1,l,r,k); } else { update(n*2,l,mid,k); update(n*2+1,mid+1,r,k); }}int query(int n,int x){ if(tree[n].l == tree[n].r) return tree[n].n; int mid=(tree[n].l+tree[n].r)/2; if(tree[n].mark==1) { tree[n*2].mark = tree[n*2+1].mark = tree[n].mark; tree[n*2].n = tree[n*2+1].n = tree[n].n; return tree[n].n; } if(x<=mid) { return query(n*2,x); } else { return query(n*2+1,x); }}int cmp(pp a, pp b){ return a.h<b.h;}int dp[111111];int main(){ int i,j,k,l,m,n; while(scanf("%d",&n) == 1) { n++; s[0].h = 0; s[0].l = 1; s[0].r = 100000; s[0].v=0; for(i = 1; i<n; i++) { scanf("%d%d%d%d",&s[i].h,&s[i].l,&s[i].r,&s[i].v); } sort(s, s+n, cmp); build(1, 1, 100000); memset(dp,0,sizeof(dp)); for(i = 0;i<n; i++) { s[i].ln=query(1, s[i].l); s[i].rn=query(1, s[i].r); // cout<<s[i].ln<<" "<<s[i].rn<<endl; update(1, s[i].l, s[i].r, i); } dp[n-1]=100+s[n-1].v; for(i=n-1; i>0; i--) { dp[s[i].ln] = max(dp[s[i].ln], dp[i]+s[s[i].ln].v); dp[s[i].rn] = max(dp[s[i].rn], dp[i]+s[s[i].rn].v); } if(dp[0]<=0) dp[0]=-1; printf("%d\n",dp[0]); } return 0;}
0 0
- hdu 3016线段树之七
- hdu 3016 #线段树 #线段覆盖
- hdu 3016(线段树+dp)
- hdu 3016 dp+线段树
- hdu 1754 线段树之二
- hdu 1698 线段树之三
- hdu 1394 线段树之四
- hdu 2795 线段树之五
- HDU 3308 线段树之区间合并
- [kuangbin带你飞]专题七 线段树 A HDU 1166
- [kuangbin带你飞]专题七 线段树 B HDU 1754
- [kuangbin带你飞]专题七 线段树 E HDU 1698
- [kuangbin带你飞]专题七 线段树 I HDU 1540
- [kuangbin带你飞]专题七 线段树 J HDU 3974
- [kuangbin带你飞]专题七 线段树 H HDU-4027
- hdu 1542 线段树之扫描线之面积并
- HDU 1828 线段树之扫描线之周长并
- hdu 3016 Man Down(线段树)
- HDU 1875 畅通工程再续 (最小生成树 水)
- 线段树入门【学习方案
- JAVA基础必备(十二)—— 反射(一)
- System.exit(0)和System.exit(1)区别
- 向量叉乘求任意多边形面积
- hdu 3016线段树之七
- C#中的@符号用法
- Mac OSX 10.9搭建nginx+mysql+php-fpm环境
- C++之练习题36
- 快速排序
- android APK签名
- Jquery,添加/删除一行输入标签
- yum更新为163的源。
- jdbc.properties 包含多种数据库驱动链接版本