题意是描述是这样的,给你n个围栏,对于每个围栏你必须走到其边上才可以往下跳,现在问你从初始最高位置的n个围栏,到原点,水平走过的路程最少是多少?

其实我可可以这样来考虑问题。由于每次都是从板子的左右两端往下面跳,我们可以从1到n有序的加入每一块板子(相当于对区间染色),加入每块板子查询一下它的两端的下面的点是什么。有了这个操作我们就可以直接预处理出来从每一块板子左右两端跳下来会落在那一块板子上面。

那应该用什么办法来实现这个查询和更新呢?显然,线段树。

下面我们等于是分别从第n块板子的左右端点往下走,然后求到原点的水平最短路了,直接一遍SPFA搞定。

上代码吧,下面省略若干个字。

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#define maxn 200100
using namespace std; const int add=;
int n,S,ans;
int l[maxn],r[maxn],fl[maxn],fr[maxn],pl[maxn],pr[maxn];
int a[*maxn],col[*maxn];
bool inq[maxn]; int abs(int x)
{
return x>=?x:-x;
} void PushDown(int rt)
{
if (col[rt]==-) return;
col[rt<<]=col[rt<<|]=col[rt];
col[rt]=-;
} void update(int rt,int l,int r,int L,int R,int id)
{
if (L<=l && R>=r)
{
col[rt]=id;
return;
}
PushDown(rt);
int mid=(l+r)>>;
if (L<=mid) update(rt<<,l,mid,L,R,id);
if (R> mid) update(rt<<|,mid+,r,L,R,id);
} int query(int rt,int l,int r,int pos)
{
if (l<=pos && r>=pos && col[rt]>=) return col[rt];
PushDown(rt);
int mid=(l+r)>>;
if (pos<=mid) return query(rt<<,l,mid,pos);
else return query(rt<<|,mid+,r,pos);
} void bfs()
{
fl[n]=S-l[n],fr[n]=r[n]-S;
queue<int> Q;
Q.push(n);
while (!Q.empty())
{
int cur=Q.front();
Q.pop(),inq[cur]=false;
int next1=pl[cur],next2=pr[cur]; if (next1==) ans=min(ans,fl[cur]+abs(add-l[cur]));
else
{
if (fl[cur]+l[cur]-l[next1]<fl[next1] || fl[cur]+r[next1]-l[cur]<fr[next1])
{
fl[next1]=min(fl[next1],fl[cur]+l[cur]-l[next1]);
fr[next1]=min(fr[next1],fl[cur]+r[next1]-l[cur]);
if (!inq[next1]) Q.push(next1),inq[next1]=true;
}
} if (next2==) ans=min(ans,fr[cur]+abs(add-r[cur]));
else
{
if (fr[cur]+r[cur]-l[next2]<fl[next2] || fr[cur]+r[next2]-r[cur]<fr[next2])
{
fl[next2]=min(fl[next2],fr[cur]+r[cur]-l[next2]);
fr[next2]=min(fr[next2],fr[cur]+r[next2]-r[cur]);
if (!inq[next2]) Q.push(next2),inq[next2]=true;
}
}
}
} int main()
{
//while (scanf("%d%d",&n,&S)!=EOF)
{
scanf("%d%d",&n,&S);
S+=add;
memset(fl,0x3f,sizeof fl);
memset(fr,0x3f,sizeof fr);
for (int i=; i<=n; i++)
{
scanf("%d%d",&l[i],&r[i]);
l[i]+=add,r[i]+=add;
pl[i]=query(,,maxn,l[i]);
pr[i]=query(,,maxn,r[i]);
update(,,maxn,l[i],r[i],i);
}
ans=~0U>>;
bfs();
printf("%d\n",ans);
}
return ;
}

POJ2374_Fence Obstacle Course的更多相关文章

  1. hdu 3152 Obstacle Course

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=3152 Obstacle Course Description You are working on t ...

  2. [转] The Single Biggest Obstacle to Trading Success

    Why do some people succeed spectacularly in the market while others fail? The market is the same for ...

  3. BZOJ 1644: [Usaco2007 Oct]Obstacle Course 障碍训练课( BFS )

    BFS... 我连水题都不会写了QAQ ------------------------------------------------------------------------- #inclu ...

  4. BZOJ 1644: [Usaco2007 Oct]Obstacle Course 障碍训练课

    题目 1644: [Usaco2007 Oct]Obstacle Course 障碍训练课 Time Limit: 5 Sec  Memory Limit: 64 MB Description 考虑一 ...

  5. 碰撞回避算法(一) Velocity Obstacle

    碰撞回避是机器人导航,游戏AI等领域的基础课题.几十年来,有很多算法被提出.注意这里主要指的是局部的碰撞回避算法.尽管和全局的路径规划算法(A*算法等)有千丝万缕的联系.可是还是有所不同的(局部的碰撞 ...

  6. 1644: [Usaco2007 Oct]Obstacle Course 障碍训练课

    1644: [Usaco2007 Oct]Obstacle Course 障碍训练课 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 383  Solved ...

  7. 障碍路线Obstacle Course

    P1649 [USACO07OCT]障碍路线Obstacle Course 裸的dfs,今天学了一个新招,就是在过程中进行最优性减枝. #include<bits/stdc++.h> us ...

  8. Velocity Obstacle

    [Velocity Obstacle] Two circular objects A,B, at time t(0), with velocity V(A),V(B). A represent the ...

  9. bzoj1644 / P1649 [USACO07OCT]障碍路线Obstacle Course

    P1649 [USACO07OCT]障碍路线Obstacle Course bfs 直接上个bfs 注意luogu的题目和bzoj有不同(bzoj保证有解,还有输入格式不同). #include< ...

随机推荐

  1. 20155230 2016-2017-2《Java程序设计》第一周学习总结

    第一周学习总结 考核方式 100分构成 翻转课堂考核12次(5*12 = 60):每次考试20-30道题目,考试成绩规格化成5分(比如总分20分就除以4) 注意:不轮什么原因,缺考没有补考机会,但有做 ...

  2. 20155232 2016-2017-3 《Java程序设计》第4周学习总结

    20155232 2016-2017-3 <Java程序设计>第4周学习总结 教材学习内容总结 第六章 继承与多态 所谓继承就是避免多个类间重复定义共同行为. 1.重复在程序设计上就是不好 ...

  3. 20155308 2016-2017-2《Java程序设计》课程总结

    20155308 2016-2017-2<Java程序设计>课程总结 每周作业链接汇总 预备作业1:回答"我专业吗.我的老师.师生关系.代码问题"四个问题. 预备作业2 ...

  4. 20155318 《Java程序设计》实验五 (网络编程与安全)实验报告

    20155318 <Java程序设计>实验五 (网络编程与安全)实验报告 实验内容 了解计算机网络基础 掌握Java Socket编程 理解混合密码系统 掌握Java 密码技术相关API的 ...

  5. 20145234黄斐《Java程序设计》第九周

    教材学习内容总结 整合数据库 JDBC入门 JDBC是用于执行SQL的解决方案,开发人员使用JDBC的标准接口,数据库厂商则对接口进行操作,开发人员无须接触底层数据库驱动程序的差异性,数据库本身是个独 ...

  6. superset 安装测试,基于windows 和 centos7.x

    1.刚开始在windows平台测试搭建,报各种问题,搭建可以参考官网https://superset.incubator.apache.org/installation.html#deeper-sql ...

  7. VS2008 "无法找到资源编译器dll 请确保路径正确"

    系统环境:windows 8.1 企业版 x64 (装有 .NET 2.0 / 3.5 / 4.0 /  4.5) 安装前确认系统已安装 .NET 2.0 / 3.5 .在安装时,最好是默认安装,并且 ...

  8. Linux中新增硬盘的分区,格式化与挂载

    Linux中新增硬盘的分区,格式化与挂载 本篇教程内容为怎样对Linux新增硬盘进行挂载,所以如果有准备新增硬盘但是有各种问题的,请参看本篇教程. 我们先说说什么是挂载? 我们知道Linux中的所有设 ...

  9. 那些年安装Appium遇到的坑

      安装appium以及相关的总体记录   1 主要流程是参照这个来 https://www.cnblogs.com/wangyinghao/p/5780151.html 细节参考虫师的博客 http ...

  10. flex布局与ellipsis冲突问题

    在flex布局里使用text-overflow: ellipsis;发现没有省略. 解决方案 .g-flex-c{ flex: 1; min-width: 0; }