hdu3016 线段树+简单DP
以每个方块左右坐标区间为节点建立字典树,每个节点保存这个区间对应的方块的下标,将方块按照高度排序。
如何得到第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的更多相关文章
- 2018.09.12 poj2376Cleaning Shifts(线段树+简单dp)
传送门 貌似贪心能过啊%%%. 本蒟蒻写的线段树优化dp. 式子很好推啊. f[i]表示覆盖1~i所需的最小代价. 那么显然对于一个区间[li,ri]" role="present ...
- 2018.07.08 hdu4521 小明系列问题——小明序列(线段树+简单dp)
小明系列问题--小明序列 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Proble ...
- Codeforces Round #271 (Div. 2) E题 Pillars(线段树维护DP)
题目地址:http://codeforces.com/contest/474/problem/E 第一次遇到这样的用线段树来维护DP的题目.ASC中也遇到过,当时也非常自然的想到了线段树维护DP,可是 ...
- 【题解】P4247 [清华集训]序列操作(线段树修改DP)
[题解]P4247 [清华集训]序列操作(线段树修改DP) 一道神仙数据结构(DP)题. 题目大意 给定你一个序列,会区间加和区间变相反数,要你支持查询一段区间内任意选择\(c\)个数乘起来的和.对1 ...
- D - The Bakery CodeForces - 834D 线段树优化dp···
D - The Bakery CodeForces - 834D 这个题目好难啊,我理解了好久,都没有怎么理解好, 这种线段树优化dp,感觉还是很难的. 直接说思路吧,说不清楚就看代码吧. 这个题目转 ...
- CF833B The Bakery 线段树,DP
CF833B The Bakery LG传送门 线段树优化DP. 其实这是很久以前就应该做了的一道题,由于颓废一直咕在那里,其实还是挺不错的一道题. 先考虑\(O(n^2k)\)做法:设\(f[i][ ...
- 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 ...
- codeforces Good bye 2016 E 线段树维护dp区间合并
codeforces Good bye 2016 E 线段树维护dp区间合并 题目大意:给你一个字符串,范围为‘0’~'9',定义一个ugly的串,即串中的子串不能有2016,但是一定要有2017,问 ...
- BZOJ2090: [Poi2010]Monotonicity 2【线段树优化DP】
BZOJ2090: [Poi2010]Monotonicity 2[线段树优化DP] Description 给出N个正整数a[1..N],再给出K个关系符号(>.<或=)s[1..k]. ...
随机推荐
- .net Core学习笔记3 编辑列表并绑定下拉列
本次主要实现列表的编辑及下拉列表的绑定 先看效果图: 主要用DropDownList绑定下拉列后端代码: 1:定义一个存下拉数据类 public class SelectItem { public s ...
- Windows核心编程&进程
1. 进程的定义 说白了进程就是一个正在运行的执行程序,包含内核对象和独立的地址空间,内核对象负责统计和管理进程信息,地址空间包括所有可执行文件或DLL 模块的代码和数据.动态内存分配(线程堆和栈的分 ...
- sqlserver datetime的bug
sqlserver datetime 的毫秒的个位似乎存在bug,只有0.3.7这三个值,比如: 2018-01-20 23:59:59:999会变成2018-01-21 00:00:00.000 2 ...
- 流API--流的迭代
虽然流不是数据存储对象,但是仍然可以使用迭代器来遍历其元素,就如同使用迭代器遍历集合中的元素一样. 流API支持2类迭代器,一类是传统的Iterator,另一类是JDK8新增的Spliterator. ...
- 学Java分布式和高架构,必懂的两大知识点!
今天小编为你们分享阿里巴巴2018年招聘应届毕业生,Java工程师的面试考题,主要分为三种 Java中获取 mysql连接的方式: 第一部分:分布式 三步变成:分布式 1.将你的整个软件视为一个系 ...
- Mac 管理员变为了普通用户怎么办?
开机的时候一直按住 command+s 出现命令行终端的时候按照以下顺序输入命令: /sbin/mount -uw 回车rm var/db/.AppleSetupDone 回车 reboot ...
- redis数据类型-有序集合
有序集合类型 在集合类型的基础上有序集合类型为集合中的每个元素都关联了一个分数,这使得我们不仅可以完成插入.删除和判断元素是否存在等集合类型支持的操作,还能够获得分数最高(或最低)的前N个元素.获得指 ...
- 淘宝地址爬取及UI展示
淘宝地址爬取及UI展示 淘宝国家省市区街道获取 参考 foxiswho 的 taobao-area-php 部分代码,改由c#重构. 引用如下: Autofac MediatR Swagger Han ...
- JasperReport报表开发(一)--原理介绍
1. JasperReport介绍 JasperReport 是一个开源的Java报表引擎,它不像其他的报表工具,例如Crystal报表是基于Java的,没有自己的表达式语法.Jasper Repor ...
- iOS-电子书开发 笔记
前言 刚接手电子书项目时,和安卓开发者pt Cai老师[aipiti Cai,一个我很敬佩很资深的开发工程师,设计领域:c++.Java.安卓.QT等]共同商议了一下,因为项目要做要同步,移动端[手机 ...