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]. ...
随机推荐
- 基于 HTML5 WebGL 的 3D SCADA 主站系统
这个例子的初衷是模拟服务器与客户端的通信,我把整个需求简化变成了今天的这个例子.3D 的模拟一般需要鹰眼来辅助的,这样找产品以及整个空间的概括会比较明确,在这个例子中我也加了,这篇文章就算是我对这次项 ...
- Ubuntu16.04下伪分布式环境搭建之hadoop、jdk、Hbase、phoenix的安装与配置
一.准备工作 安装包链接: https://pan.baidu.com/s/1i6oNmOd 密码: i6nc 环境准备 修改hostname: $ sudo vi /etc/hostname why ...
- Sonar 数据库表关系整理一(rule相关)
更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 原文链接:http://www.cnblogs.com/zishi/p/7510072.html 简介:Sonar ...
- iOS-隐藏Navigationbar【导航栏无缝圆滑的隐藏】
1.ViewController .m - (void)viewDidLoad { [super viewDidLoad]; self.title = @"隐藏导航栏"; UIBu ...
- Log4Net记录到MySql
1.新建控制台程序. 2.添加Log4Net nuget 3.添加MySql 引用 4.添加配置文件如下: <?xml version="1.0"?> <conf ...
- python扒取百宝彩网站江西快三当日期号及开奖结果
一.环境 windows10+python27 二.需求: 1.获取百宝彩网站中,江西快三当日的开奖期号和中奖号码: 2.根据输入期号,输出开奖号码: 三.上代码 #!/bin/env python ...
- java 世界中Annotation
java 世界中Annotation 在github上开始汇总一些自己学习,收集,总结,经验的一些信息,有利于跟踪,修改,提升.如果你感兴趣 可以关注一下,也可以提供自己的内容进来. https:// ...
- ZOJ [P2314] 无源汇点有上下界模版
对于有上下界的网络流来说,我们可以分离出必要弧,然后将必要弧切开,两端分别连接源点和汇点,原图有可行解充要于源点或汇点满流. 这样求下来,只能求出可行流 #include <iostream&g ...
- BZOJ 3698: XWW的难题 [有源汇上下界最大流]
3698: XWW的难题 题意:(1)A[N][N]=0:(2)矩阵中每行的最后一个元素等于该行前N-1个数的和:(3)矩阵中每列的最后一个元素等于该列前N-1个数的和.给A中的数进行取整操作(可以是 ...
- AMDP + XSLX Workbench 报表开发模式
本文介绍了我和同事通过使用AMDP + XSLX Workbench缩短报表开发周期.分离数据查询处理逻辑和前端展示工作的经验.欢迎讨论. 前言 最近接到了一套人力资源报表的开发需求,需要以EXCEL ...