BZOJ3387栅栏(另一种解法:spfa)
题目描述 + 讲解
经典例题了,常规解法是 用线段树优化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)相关推荐
- usaco Ordered Fractions 顺序的分数(两种解法)
这题很好玩,这里有两种解法. 第一种我自己写的,先找到所有的既约真分数,然后写了一个cmp函数进行排序最后输出.我写的时候还在想这章不是搜索吗这跟搜索关系不大吧,难道是怕我们思维定式化故意出的题不是搜 ...
- 青蛙跳台阶c语言递归函数,青蛙跳台阶问题的四种解法
http://raychase.iteye.com/blog/1337359 题目:一只青蛙一次可以跳1级台阶,也可以跳2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 这道题还被ITEye放在了博 ...
- opengl正方形绕点旋转_一题十五种解法够不够? 旋转,构造,四点共圆乐不停...
平移,旋转,轴对称是我们初中学习的"几何三大变换".在我们初中阶段学习的几何知识中占据着核心的地位,特别是旋转,那更是核心中的核心(河南中考22题年年考). 如何更好的理解旋转,如 ...
- 约瑟夫环问题的两种解法(详解)
约瑟夫环问题的两种解法(详解) 题目: Josephus有过的故事:39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓.于是决定了自杀方式,41个人排成一个圆 ...
- 牛客--追债之旅 两种解法
文章目录 第一种 第二种: 一共两种解法,所以即便你不会最短路,也可以做,甚至爆搜+剪枝的时间和空间消耗小于最短路做法. 第一种 题意: 小明现在要追讨一笔债务,已知有n座城市,每个城市都有编号,城市 ...
- java binarytreenode_LeetCode算法题-Binary Tree Paths(Java实现-3种解法)
这是悦乐书的第199次更新,第206篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第62题(顺位题号是257).给定二叉树,返回所有根到叶路径.例如: 输入: 1 / \ ...
- 关于leetcode第K个最大元素的几种解法
对于这一题我使用了最大堆,快速排序,归并排序几种解法来做这一题,速度最快的是归并排序 使用定值的最小堆每次更新数组最后剩下前k个最大元素,而且堆顶就是我们要的第K个元素. 堆排序: import he ...
- [简单题]自定义取余(三种解法)C++实现
题目链接: 点击打开原题链接 题目意思,就是标题意思. 第一种解法:(加法迭代)用加法来模拟这个(17行代码) int mod256WithoutMod(int number) {if (number ...
- 推荐系统炼丹笔记:Embedding在内存问题上的一种解法
作 者:一元 公众号:炼丹笔记 很多朋友都会发现,修改embedding的大小能对深度模型带来非常大的影响,往往越大的embedding能带来更佳的效果,但是却因为Embedding内存的问题,没法直 ...
最新文章
- Ubuntu16.04桌面系统如何配置和启动wireshark
- jupyter 写入csv pandas_Pandas 最详细教程在这里
- pandas为所有的列名添加后缀(add_suffix)
- 太阳能板如何串联_还在犹豫用不用太阳能灯?这些分析让你少花钱,更省钱。...
- “好的软件人员一生必看的六十本书”
- 美方首次起诉4名俄黑客 其中两人系俄安全局官员
- Excel:python结合Excel使用技巧经验总结之(将python输出的等间隔列数据直接粘贴复制存到物理表格内等)图文教程之详细攻略
- linux内核杂记(7)-进程调度(2)
- BZOJ 3251: 树上三角形
- wpf treeview使用expanded事件出错的问题
- 保存文件 安卓_手机怎么解压zip文件 安卓手机zip文件怎么打开?
- qq群机器人宠物系统java_QQ群机器人——宠物游戏
- 【完整matlab程序】【预测程序】狼群优化算法及BP神经网络
- web网页设计期末课程大作业:美食餐饮文化主题网站设计——中华美德6页面html css javascript
- 风动9000D | 风刃500 D | 心动的感觉
- 不等式大两边小中间_不等式取值范围口诀
- 像素画软件android,Pixly像素画编辑器
- 程序员写程序的逻辑思维,和外行人想当然的思维,到底有什么不同
- 双精度浮点数double
- 一文读懂JVM虚拟机:JVM虚拟机的内存管理(万字详解)
热门文章
- PixelUtils:像素转换工具
- u-boot下载地址
- 揭秘“爆款级”产品!看葡萄城活字格低代码平台是如何诞生的
- jmete-jp@gc - Throughput Shaping Timer的使用
- 自学编程,10个程序员学习必收藏的编程网站,你知道几个?
- RabbitMQ管理界面基本操作
- UE4-如何做一个简单的TPS角色(二)-实现角色基础移动
- PyTorch(13)---优化器_随机梯度下降法
- 广州大学 计算机网络实验3 使用网络协议分析器捕捉和分析协议数据包 2020版
- 2018互联网寒冬之裁员浪潮--感同深受(winter is here)