题目链接

线段树\(+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. jQuery的封装

    封装,最简单的效果就是一个效果你可以重复的去调用   本来前端之路时间不是很长,但是对封装还是有一点点自己个人的理解,曾经踩过的坑也不在少数,最后总结出我个人风格的封装,听一位大神指点过,每个人都有属 ...

  2. 利用html2canvas将当前网页保存为图片.

    先分析下这个技术可实现的方式,以及优缺点吧! 前端实现 缺点是:兼容性查,需要高级浏览器支持,因为需要支持 canvas 绘图,还有就是会操作 html5 canvas api.(如果不会使用canv ...

  3. PHP命令行(CLI模式)

    CLI模式 CLI模式其实就是命令行运行模式,英文全称Command-Line Interface(命令行接口) $ php -h Usage: php [options] [-f] <file ...

  4. 总结laravel假数据填充步骤

    定义好模型 xxx.php 定义好数据生成的规则 database/factories/XxxlFactory.php 写入生成数据的代码,控制好生成的数据数目,对生成后的数据做出修改 databas ...

  5. stata操作

    //stata操作 *************************数据基本操作****************************** gen varname = value //定义变量 r ...

  6. 第一天的题目 简单A+B 植树问题 多项式的值

    #include<stdio.h> int main() { int a=0;b=0; scanf("%d%d",&a,&b); printf(&quo ...

  7. ccpc 2018 final G - Pastoral Life in Stardew Valley

    #include <iostream> #include<cstdio> #include<cstring> #include<queue> using ...

  8. shell重温---基础篇(参数传递&echo命令)

    经过前两天的学习,关于shell的基础算是知道的一般般啦,最起码不算是小白了(纯属意淫).今天就来点干货哈.   首先是运行shell脚本时的参数传递.脚本内获取参数的格式为$n.n代表了一个数字,例 ...

  9. 【WPF】创建基于模板的WPF控件(经典)

    原文:[WPF]创建基于模板的WPF控件(经典) WPF可以创建两种控件,它们的名字也很容易让人混淆:用户控件(User Control)和定制控件(Customer Control),之所以如此命名 ...

  10. 1698-Just a Hook 线段树(区间替换)

    Just a Hook Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...