题目链接

线段树\(+dp\).

先用线段树预处理出每个线段从左边和右边掉落到哪里,记为\(f[i][0/1]\).

然后记\(g[i][0/1]\)为到达第\(i\)个线段的左边或右边所要的最小时间,注意这里并没有算纵坐标的掉落时间,因为这个可以在最后统计答案时加上一个初始的纵坐标。

然后转移时从上到下把线段排个序,分左右两种情况转移。这里注意下给出的限制,即掉落的高度小于\(max\)时才转移。

#pragma GCC optimize(3)
#include<bits/stdc++.h>
using namespace std;
void read(int &x){
x=0;int f=1;char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-f;
for(;isdigit(ch);ch=getchar()) x=(x<<1)+(x<<3)+ch-'0';x*=f;
}
#define write(x) printf("%d\n",x)
#define maxn 200050
#define ls p<<1
#define rs p<<1|1
#define mid ((l+r)>>1)
struct segment_tree {
int val[maxn<<3],tag[maxn<<3];
void pushdown(int p) {
if(!tag[p]) return ;
tag[ls]=tag[rs]=val[ls]=val[rs]=tag[p],tag[p]=0;
}
void cover(int p,int l,int r,int x,int y,int v) {
if(x<=l&&r<=y) return tag[p]=v,val[p]=v,void();
pushdown(p);
if(x<=mid) cover(ls,l,mid,x,y,v);
if(y>mid) cover(rs,mid+1,r,x,y,v);
}
int query(int p,int l,int r,int x) {
if(l==r) return val[p];
pushdown(p);
if(x<=mid) return query(ls,l,mid,x);
else return query(rs,mid+1,r,x);
}
}T;
struct data {int x,y,l,r,h;}a[maxn];
int n,mx,sx,sy,vec[maxn],f[maxn][2],g[maxn][2];
const int N = 200000;
int cmp(data a,data b){return a.h<b.h;}
int main(){
read(n);read(mx),read(sx),read(sy);
for(int i=1;i<=n;i++) {
read(a[i].h),read(a[i].l),read(a[i].r);
vec[++vec[0]]=a[i].l,vec[++vec[0]]=a[i].r;
}
sort(vec+1,vec+vec[0]+1);
for(int i=1;i<=n;i++) {
a[i].x=lower_bound(vec+1,vec+vec[0]+1,a[i].l)-vec;
a[i].y=lower_bound(vec+1,vec+vec[0]+1,a[i].r)-vec;
}
//sort(a+1,a+n+1,[&](data a,data b){return a.h<b.h;});
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++) {
f[i][0]=T.query(1,1,N,a[i].x),f[i][1]=T.query(1,1,N,a[i].y);
if(a[i].h-a[f[i][0]].h>mx) f[i][0]=-1;
if(a[i].h-a[f[i][1]].h>mx) f[i][1]=-1;
T.cover(1,1,N,a[i].x,a[i].y,i);
}
int st=lower_bound(vec+1,vec+vec[0]+1,sx)-vec;
int p=T.query(1,1,N,st);memset(g,63,sizeof g);
g[p][0]=sx-a[p].l,g[p][1]=a[p].r-sx;
for(int i=p;i;i--) {
if(f[i][0]!=-1) {
g[f[i][0]][0]=min(g[f[i][0]][0],g[i][0]+(!f[i][0]?0:a[i].l-a[f[i][0]].l));
g[f[i][0]][1]=min(g[f[i][0]][1],g[i][0]+(!f[i][0]?0:a[f[i][0]].r-a[i].l));
}
if(f[i][1]!=-1) {
g[f[i][1]][0]=min(g[f[i][1]][0],g[i][1]+(!f[i][1]?0:a[i].r-a[f[i][1]].l));
g[f[i][1]][1]=min(g[f[i][1]][1],g[i][1]+(!f[i][1]?0:a[f[i][1]].r-a[i].r));
}
}
//for(int i=n;i;i--) printf("%d %d\n",g[i][0],g[i][1]);
write(min(g[0][0],g[0][1])+sy);
return 0;
}

[luogu P1442] 铁球落地的更多相关文章

  1. luogu P2765 魔术球问题 (最小路径覆盖)

    大意:给定n根柱子, 依次放入1,2,3,...的球, 同一根柱子相邻两个球和为完全平方数, 求最多放多少个球. 对和为平方数的点连边, 就相当于求DAG上最小路径覆盖. #include <i ...

  2. luogu P2765 魔术球问题

    题目中没有说球的上限是多少,只告诉了柱子,那么我们就应该以柱子为界去增加球,考虑将每两个能组成完全平方数的点连边,就形成了一个DAG(有向无环图),由于是DAG,可以转换为最小覆盖问题,即最多有n条路 ...

  3. luogu P2113 看球泡妹子

    2333 这么水的蓝题 f[i][j] 表示看了i场比赛,小♀红的什么东西为j时小♂明的什么值 强行压维蛤蛤 剩下的转移很简单(注意i的循环顺序从后往前,01背包) (具体见代码) #include& ...

  4. Android 属性动画(Property Animation) 完全解析 (上)

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38067475 1.概述 Android提 供了几种动画类型:View Anima ...

  5. 【转】Android 属性动画(Property Animation) 完全解析 (上)

    http://blog.csdn.net/lmj623565791/article/details/38067475 1.概述 Android提供了几种动画类型:View Animation .Dra ...

  6. Android 属性动画(一)

    1.概述 Android提供了几种动画类型:View Animation .Drawable Animation .Property Animation .View Animation相当简单,不过只 ...

  7. javascript requestAnimationFarme

    今天看到一篇很好的文章推荐一下:原文地址:http://www.zhangxinxu.com/wordpress/?p=3695 CSS3动画那么强,requestAnimationFrame还有毛线 ...

  8. CSS3动画那么强,requestAnimationFrame还有毛线用?

    一.哟,requestAnimationFrame, 新同学,先自我介绍下 Hello, 大家好,我就是风姿卓越,万种迷人的requestAnimationFrame,呵呵呵呵.很高兴和大家见面,请多 ...

  9. CSS3动画那么强,requestAnimationFrame还有毛线用--摘抄

    CSS3动画那么强,requestAnimationFrame还有毛线用? 这篇文章发布于 2013年09月30日,星期一,19:12,归类于 web综合. 阅读 197124 次, 今日 84 次 ...

随机推荐

  1. idea中创建web项目搭建Hibernate框架连接oracle数据库

    hibernate框架 hibernate是数据化持久工具,也是一个开源代码的ORM解决方案.hibernate内部封装了通过jdbc访问数据库的操作,向商场应用提供面向对象的数据访问api. hib ...

  2. js判断两个日期是否在几个月之内

    //比较两个时间 time1,time2均为日期类型 //判断两个时间段是否相差 m 个月 function completeDate(time1 , time2 , m) { var diffyea ...

  3. less学习三---父选择器

    引用父选择器需要用到“&”符号 &运算符表示嵌套规则的父选择器,并且在修改类或伪类选择器的应用中非常普遍 ul{ li{ &:nth-child(2) a { color: r ...

  4. 数据解压及if else的应用

    def sum(items): head, *tails = items return head + sum(tails) if tails else head # 最后一句有点像三目运算符,如果ta ...

  5. 用bootstrap框架弄的网站。(首页)

    网站的每一处代码都加上注解,以便浏览! 效果图: <!doctype html>   <html lang="zh-cn">   <head> ...

  6. PHP(YII2实现) 微信网页授权

    参考地址 https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842 实现步骤分析: 获取code->access ...

  7. STM32Cube 5.0 使用V1.7.0的固件库生成keil5环境下的F1工程时发现问题

    生成的stm32f1xx_hal_msp.c文件里面,HAL_MspInit(void)函数居然没有了之前1.6库里面的系统中断优先级的设置: /* MemoryManagement_IRQn int ...

  8. 阿里云异常网络连接-可疑WebShell通信行为的分析解决办法

    2018年10月27日接到新客户网站服务器被上传了webshell脚本木马后门问题的求助,对此我们sine安全公司针对此阿里云提示的安全问题进行了详细分析,ECS服务器被阿里云提示异常网络连接-可疑W ...

  9. C++11中rvalue references的使用

    Rvalue references are a feature of C++ that was added with the C++11 standard. The syntax of an rval ...

  10. Android2.2以上的版本HttpURLConnection.getContentLength()获取的size跟下载下来的file的legth不相等

    2.2以上的版本下载网络资源不完整无法更新.HttpURLConnection.getContentLength()获取的size跟下载下来的file的legth不等. 原因是:HttpURLConn ...