题目链接

线段树\(+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. mysql数据库和数据表的简单操作

    一.数据库的增删改查 1.新建数据库 CREATE DATABASE 数据库名 charset utf8; 数据库名规则:可以由字母.数字.下划线.@.#.$ 区分大小写, 不能使用关键字如 crea ...

  2. 初学Node.js -环境搭建

    从毕业一直到现在都是在做前端,总感觉缺少点什么,java? PHP? .Net? 框架太多了,学起来不好掌握,听说node.js挺牛的,我决定把node.js好好的学一下.首先是环境的配置,这个配置真 ...

  3. Angular简单总结

    AngularJS AngularJS四大特征 MVC模式 双向绑定 依赖注入 模块化设计 AngularJS 表达式 AngularJS 表达式写在双大括号内{{expression }},可以包含 ...

  4. Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO

    你有碰上过这样的提示吗? Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in t ...

  5. CacheManager源码分析

    计算rdd的某个分区是从RDD的iterator()方法开始的,我们从这个方法进入 然后我们进入getOrCompute()方法中看看是如何进行读取数据或计算的 getOrElseUpdate()方方 ...

  6. python基础小知识,is和==的区别,编码和解码

    1.is和==的区别 1)id() 通过id()我们可以查看到一个变量表示的值在内存中的地址 >>> s1 = "Tanxu" >>> s2 = ...

  7. C# 测量程序运行时间

    using System.Diagnostics; Stopwatch watch = new Stopwatch(); watch.Start(); /* 需要测量运行时间的程序 */ watch. ...

  8. 【EXCEL】SUMIF(条件を指定して数値を合計する)

    Mirocrosoft Excel

  9. LeetCode:21. Merge Two Sorted Lists(Easy)

    1. 原题链接 https://leetcode.com/problems/merge-two-sorted-lists/description/ 2. 题目要求 给出两个已经从小到大排序的链表ls1 ...

  10. Hadoop Sentry 学习

    什么是Sentry? Sentry 是Cloudera 公司发布的一个Hadoop开源组件,它提供细粒度基于角色的安全控制 Sentry下的数据访问和授权 通过引进Sentry,Hadoop目前可在以 ...