题目描述 + 讲解

经典例题了,常规解法是 用线段树优化dp数组,dp很好想,线段树优化难写。
这里我给出另一种解法,最短路spfa。(也不好想)


因为只要求x轴上的运动路径。所以只有栅栏的边界是有用的。想象他的总体运动轨迹时,可以以边界为点,相互连线(斜的不影响),之间距离为x轴距离差。

最短路解法的关键是尽量建少的边。

从上面运动到下面,和从下面移动下面是一样的。
因为他输入的数据是从下到上。所以从下至上考虑也可以。

对于之前的端点(不管左右),如果在现在的[x,y]内,可能存在阻拦,然后用左右端点与之建边,并去除改节点。然后储存进现在这两个端点。

set不重复,且自动排序。首先他不影响建边,遇到相同时,建的边长度为0。因为他的不重复,可以少建边。


部分代码:

int n,s,head[maxn],cnt,d[maxn],c;
bool vis[maxn];
set<int>sz;
map<int,int>mp;
struct edge{    int to,w,next;  }e[maxn];
void add(int u,int v,int w){e[++cnt].w=w;    e[cnt].to=v;e[cnt].next=head[u];  head[u]=cnt;
}
void spfa(){queue<int>q;  q.push(1);  memset(d,inf,sizeof(d));    d[1]=0;    vis[1]=1; while(!q.empty()){int x=q.front();  vis[x]=0;  q.pop();for(int i=head[x];i;i=e[i].next){int y=e[i].to,w=e[i].w;if(d[y]>d[x]+w){d[y]=d[x]+w;if(!vis[y]){  q.push(y);  vis[y]=1;  }}}}
}
int main(){n=read();   s=read();sz.insert(0); mp[0]=1;   c++;set<int>::iterator it;for(int i=0;i<n;i++){int x,y;   x=read();  y=read();it=sz.lower_bound(x);while(it!=sz.end()){int t=(*it);if(t>y)    break;add(mp[t],c+1,t-x);add(mp[t],c+2,y-t);it++;sz.erase(t);}mp[x]=++c; mp[y]=++c;sz.insert(x);  sz.insert(y);}c++;for(it=sz.begin();it!=sz.end();it++)    add(mp[(*it)],c,abs(s-(*it)));spfa();printf("%d",d[c]);
}

BZOJ3387栅栏(另一种解法:spfa)相关推荐

  1. usaco Ordered Fractions 顺序的分数(两种解法)

    这题很好玩,这里有两种解法. 第一种我自己写的,先找到所有的既约真分数,然后写了一个cmp函数进行排序最后输出.我写的时候还在想这章不是搜索吗这跟搜索关系不大吧,难道是怕我们思维定式化故意出的题不是搜 ...

  2. 青蛙跳台阶c语言递归函数,青蛙跳台阶问题的四种解法

    http://raychase.iteye.com/blog/1337359 题目:一只青蛙一次可以跳1级台阶,也可以跳2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 这道题还被ITEye放在了博 ...

  3. opengl正方形绕点旋转_一题十五种解法够不够? 旋转,构造,四点共圆乐不停...

    平移,旋转,轴对称是我们初中学习的"几何三大变换".在我们初中阶段学习的几何知识中占据着核心的地位,特别是旋转,那更是核心中的核心(河南中考22题年年考). 如何更好的理解旋转,如 ...

  4. 约瑟夫环问题的两种解法(详解)

    约瑟夫环问题的两种解法(详解) 题目: Josephus有过的故事:39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓.于是决定了自杀方式,41个人排成一个圆 ...

  5. 牛客--追债之旅 两种解法

    文章目录 第一种 第二种: 一共两种解法,所以即便你不会最短路,也可以做,甚至爆搜+剪枝的时间和空间消耗小于最短路做法. 第一种 题意: 小明现在要追讨一笔债务,已知有n座城市,每个城市都有编号,城市 ...

  6. java binarytreenode_LeetCode算法题-Binary Tree Paths(Java实现-3种解法)

    这是悦乐书的第199次更新,第206篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第62题(顺位题号是257).给定二叉树,返回所有根到叶路径.例如: 输入: 1 / \ ...

  7. 关于leetcode第K个最大元素的几种解法

    对于这一题我使用了最大堆,快速排序,归并排序几种解法来做这一题,速度最快的是归并排序 使用定值的最小堆每次更新数组最后剩下前k个最大元素,而且堆顶就是我们要的第K个元素. 堆排序: import he ...

  8. [简单题]自定义取余(三种解法)C++实现

    题目链接: 点击打开原题链接 题目意思,就是标题意思. 第一种解法:(加法迭代)用加法来模拟这个(17行代码) int mod256WithoutMod(int number) {if (number ...

  9. 推荐系统炼丹笔记:Embedding在内存问题上的一种解法

    作 者:一元 公众号:炼丹笔记 很多朋友都会发现,修改embedding的大小能对深度模型带来非常大的影响,往往越大的embedding能带来更佳的效果,但是却因为Embedding内存的问题,没法直 ...

最新文章

  1. Ubuntu16.04桌面系统如何配置和启动wireshark
  2. jupyter 写入csv pandas_Pandas 最详细教程在这里
  3. pandas为所有的列名添加后缀(add_suffix)
  4. 太阳能板如何串联_还在犹豫用不用太阳能灯?这些分析让你少花钱,更省钱。...
  5. “好的软件人员一生必看的六十本书”
  6. 美方首次起诉4名俄黑客 其中两人系俄安全局官员
  7. Excel:python结合Excel使用技巧经验总结之(将python输出的等间隔列数据直接粘贴复制存到物理表格内等)图文教程之详细攻略
  8. linux内核杂记(7)-进程调度(2)
  9. BZOJ 3251: 树上三角形
  10. wpf treeview使用expanded事件出错的问题
  11. 保存文件 安卓_手机怎么解压zip文件 安卓手机zip文件怎么打开?
  12. qq群机器人宠物系统java_QQ群机器人——宠物游戏
  13. 【完整matlab程序】【预测程序】狼群优化算法及BP神经网络
  14. web网页设计期末课程大作业:美食餐饮文化主题网站设计——中华美德6页面html css javascript
  15. 风动9000D | 风刃500 D | 心动的感觉
  16. 不等式大两边小中间_不等式取值范围口诀
  17. 像素画软件android,Pixly像素画编辑器
  18. 程序员写程序的逻辑思维,和外行人想当然的思维,到底有什么不同
  19. 双精度浮点数double
  20. 一文读懂JVM虚拟机:JVM虚拟机的内存管理(万字详解)

热门文章

  1. PixelUtils:像素转换工具
  2. u-boot下载地址
  3. 揭秘“爆款级”产品!看葡萄城活字格低代码平台是如何诞生的
  4. jmete-jp@gc - Throughput Shaping Timer的使用
  5. 自学编程,10个程序员学习必收藏的编程网站,你知道几个?
  6. RabbitMQ管理界面基本操作
  7. UE4-如何做一个简单的TPS角色(二)-实现角色基础移动
  8. PyTorch(13)---优化器_随机梯度下降法
  9. 广州大学 计算机网络实验3 使用网络协议分析器捕捉和分析协议数据包 2020版
  10. 2018互联网寒冬之裁员浪潮--感同深受(winter is here)