题目链接

线段树\(+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. Vue2+VueRouter2+webpack+vue-cil构建完整项目实例(附:详细步骤截图)

    引用1:https://segmentfault.com/a/1190000008557578 引用2:https://blog.csdn.net/wulala_hei/article/details ...

  2. Spark-源码-Spark-StartAll Master Worler启动流程

    Spark start-all>> """Master启动流程""" Master类 class Master( host: S ...

  3. mysql 筛选重复名称

    CREATE TABLE `blur_article` ( `id` ) NOT NULL, `name` ) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=In ...

  4. VGA 时序标准

    VGA 显示器扫描方式从屏幕左上角一点开始,从左像右逐点扫描,每扫描完一行,电子束回到屏幕的左边下一行的起始位置,在这期间,CRT 对电子束进行消隐,每行结束时,用行同步信号进行同步:当扫描完所有的行 ...

  5. 局域网访问不到linux下的tomcat

    问题描述: CentOS安装完成Tomcat后,访问本地:http://localhost:8080/正确.但局域网内无法访问,而且服务器可ping通 经查原因为防火墙开启: [root@localh ...

  6. MUI:字符串和json数据的相互转换

    JSON.parse()--字符串转换json.JSON.stringify()--json转换成字符串 如:收到Json对象:response,则: {"result":&quo ...

  7. struts2官方 中文教程 系列六:表单验证

    先贴个本帖的地址,以免被爬:struts2教程 官方系列六:表单验证  即 http://www.cnblogs.com/linghaoxinpian/p/6906720.html 下载本章节代码 介 ...

  8. Union-find 并查集

    解决问题 给一系列对点0~N-1的连接,判断某两个点p与q是否相连. private int[] id; // 判断p和q是否属于同一个连通分量 public boolean connected(in ...

  9. beego orm

    http://beego.me/docs/mvc/model/overview.md go get github.com/astaxie/beego/orm Simple Usage package ...

  10. 【jQuery】 资料

    [jQuery] 资料 1. 选择器 http://www.w3school.com.cn/jquery/jquery_ref_selectors.asp 2. 事件 http://www.w3sch ...