以每个方块左右坐标区间为节点建立字典树,每个节点保存这个区间对应的方块的下标,将方块按照高度排序。

如何得到第i个方块可以移动到的两个方块呢?将所有方块排完序,将前i-1个方块放入字典树,根据第i个方块的左右坐标,分别进行单点查询即可,将下一个位置保存。

最后的DP转移方程d[i]=max(d[i].left,d[i].right)+d[i].val;

AC代码:

#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=1e5+5;
struct node{
	int l,r,ind;
}tree[maxn*4];
struct point{
	int l,r,h,val;
	point(){
	}
	point(int h,int l,int r,int val):h(h),l(l),r(r),val(val){
	}
	bool operator <(const point &p)const{
		return h<p.h;
	}
}plank[maxn];
void Build(int l,int r,int cur){ //建树并初始化为floor
	tree[cur].l=l;
	tree[cur].r=r;
	tree[cur].ind=0;
	if(l==r) return;
	Build(l,(l+r)>>1,cur<<1);
	Build((l+r)/2+1,r,(cur<<1)+1);
}
int ind;
void Insert(int l,int r,int cur){ //更新区间的值
	//printf("%d %d\n",l,r);
	int ll=tree[cur].l,rr=tree[cur].r;
	if(l==ll&&r==rr) {
		tree[cur].ind=ind;
		return;
	}
	int mid=(ll+rr)>>1;
	if(r<=mid) Insert(l,r,cur<<1);
	else if(l>=mid+1) Insert(l,r,(cur<<1)+1);
	else {
		Insert(l,mid,cur<<1);
		Insert(mid+1,r,(cur<<1)+1);
	}
}
int val;
int Search(int cur){ //搜索可以到达的下一个格子区间,返回下标
	int l=tree[cur].l,r=tree[cur].r;
	if(l==r) return tree[cur].ind;
	int ind=tree[cur].ind;
	int mid=(l+r)>>1;
	int a;
	if(val<=mid) a=Search(cur<<1);
	else a=Search((cur<<1)+1);
	return plank[ind].h>plank[a].h?ind:a;
}
int main(){
	plank[0]=point(0,0,0,0);
	int n;
	while(scanf("%d",&n)==1){
		int l,r,h,v,width=-1;
		for(int i=1;i<=n;++i) {
			scanf("%d%d%d%d",&h,&l,&r,&v);
			width=max(width,r);
			plank[i]=point(h,l,r,v);
		}
		Build(1,width,1);
		sort(plank+1,plank+n+1); //按高度排序
		for(int i=1;i<=n;++i){
			int l=plank[i].l,r=plank[i].r;
			val=l;
			plank[i].l=Search(1);
			val=r;
			plank[i].r=Search(1);
			//printf("%d %d\n",plank[i].l,plank[i].r);
			ind=i;
			Insert(l,r,1);
		}
		for(int i=1;i<=n;++i){
			int l=plank[i].l,r=plank[i].r;
			plank[i].val+=max(plank[l].val,plank[r].val);
		}
		if(plank[n].val+100<=0) printf("-1\n");
		else printf("%d\n",plank[n].val+100);
	}
	return 0;
}

如有不当之处欢迎指出!

hdu3016 线段树+简单DP的更多相关文章

  1. 2018.09.12 poj2376Cleaning Shifts(线段树+简单dp)

    传送门 貌似贪心能过啊%%%. 本蒟蒻写的线段树优化dp. 式子很好推啊. f[i]表示覆盖1~i所需的最小代价. 那么显然对于一个区间[li,ri]" role="present ...

  2. 2018.07.08 hdu4521 小明系列问题——小明序列(线段树+简单dp)

    小明系列问题--小明序列 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Proble ...

  3. Codeforces Round #271 (Div. 2) E题 Pillars(线段树维护DP)

    题目地址:http://codeforces.com/contest/474/problem/E 第一次遇到这样的用线段树来维护DP的题目.ASC中也遇到过,当时也非常自然的想到了线段树维护DP,可是 ...

  4. 【题解】P4247 [清华集训]序列操作(线段树修改DP)

    [题解]P4247 [清华集训]序列操作(线段树修改DP) 一道神仙数据结构(DP)题. 题目大意 给定你一个序列,会区间加和区间变相反数,要你支持查询一段区间内任意选择\(c\)个数乘起来的和.对1 ...

  5. D - The Bakery CodeForces - 834D 线段树优化dp···

    D - The Bakery CodeForces - 834D 这个题目好难啊,我理解了好久,都没有怎么理解好, 这种线段树优化dp,感觉还是很难的. 直接说思路吧,说不清楚就看代码吧. 这个题目转 ...

  6. CF833B The Bakery 线段树,DP

    CF833B The Bakery LG传送门 线段树优化DP. 其实这是很久以前就应该做了的一道题,由于颓废一直咕在那里,其实还是挺不错的一道题. 先考虑\(O(n^2k)\)做法:设\(f[i][ ...

  7. Codeforces Round #426 (Div. 2) D 线段树优化dp

    D. The Bakery time limit per test 2.5 seconds memory limit per test 256 megabytes input standard inp ...

  8. codeforces Good bye 2016 E 线段树维护dp区间合并

    codeforces Good bye 2016 E 线段树维护dp区间合并 题目大意:给你一个字符串,范围为‘0’~'9',定义一个ugly的串,即串中的子串不能有2016,但是一定要有2017,问 ...

  9. BZOJ2090: [Poi2010]Monotonicity 2【线段树优化DP】

    BZOJ2090: [Poi2010]Monotonicity 2[线段树优化DP] Description 给出N个正整数a[1..N],再给出K个关系符号(>.<或=)s[1..k]. ...

随机推荐

  1. python2.7.5 安装pip

    1 先安装setuptools 下载地址:https://pypi.python.org/pypi/setuptools#downloads 将下载后的tar文件解压,用CMD模式进入到解压后的文件所 ...

  2. junit断言总结

    我们平时编写自己的测试类,如果没有断言,那么就没写测试的必要了. JUnit框架用一组assert方法封装了最常见的测试任务.这些assert方法可以极大地简化单元测试的编写. Assert类包含了一 ...

  3. input标签(待填坑)

    input标签几种属性值 button:用作定义按钮 checkbox:定义复选框 file:供文件上传 hidden:定义隐藏的输入字段 image:图像形式的提交按钮 password:密码字段 ...

  4. 【转】shell学习笔记(二) ——shell变量

    在shell中有3种变量:系统变量,环境变量和用户变量,其中系统变量在对参数判断和命令返回值判断时会使用,环境变量主要是在程序运行时需要设置,用户变量在编程过程中使用量最多. 1 系统变量  变量名 ...

  5. TCP之再谈解决服务器TIMEWAIT过多的问题

    原则 TIMEWAIT并不是多余的.在TCP协议被创造,经历了大量的实际场景实践之后,TIMEWAIT出现了,因为TCP主动关闭连接的一方需要TIMEWAIT状态,它是我们的朋友.这是<UNIX ...

  6. Win7系统下彻底删除无用服务的方法

    win7系统下中有非常多的服务项,用户来满足不同行业用户间的所有需求,系统服务也是执行指定系统功能的程序,许多情况下我们想要运行软件或执行外接设备都无法离开系统服务,但并非所有系统服务都是我们用到的, ...

  7. R语言-探索两个变量

    目的: 通过探索文件pseudo_facebook.tsv数据来学会两个变量的分析流程 知识点: 1.ggplot语法 2.如何做散点图 3.如何优化散点图 4.条件均值 5.变量的相关性 6.子集散 ...

  8. Python CRM项目七

    仿照Django Admin实现对readonly的字段进行设置 功能点: 1.页面不可进行更改 2.如果改变html代码中的值,则需要进行后端的数据库数据校验 3.可以对某些字段进行自定制校验规则 ...

  9. SpringMVC环境搭建---xml版及注解版

    一.建立 JavaWeb 项目(基于Intellij 14.0.3搭建) 1.建立一个 Java 项目,在项目下新建一个文件夹 webapp ,然后在该文件夹下新建一个 WEB-INF 文件夹: 2. ...

  10. 分组密码的工作模式--wiki

    密码学中,块密码的工作模式允许使用同一个块密码密钥对多于一块的数据进行加密,并保证其安全性.[1][2] 块密码自身只能加密长度等于密码块长度的单块数据,若要加密变长数据,则数据必须先被划分为一些单独 ...