首先,很容易想到Dp。设f[i][0]表示第i个栅栏走左边的最短路,f[i][1]表示第i个栅栏走右边的最短路。

所以,我们要找一个刚好在第i个栅栏的左右边界下面的栅栏。如图所示:

则有:

f[i][0] = min(f[k][0] + |Left[i] - Left[k]| , f[k][1] + |Left[i] - Right[k]| )

f[i][1] = min(f[j][0] + |Right[i] - Left[j]| , f[j][1] + |Right[i] - Right[j]| )

那么,该怎样求k和j呢?

很容易想到开一个数组,从小到大覆盖。但这样的时间复杂度是O(n^2)的。用线段树区间修改,单点查询就可以了。

附上程序:

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <string>
#include <cstdlib>
#include <bitset>
#include <fstream>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <ctime>
#include <deque>
#include <vector>
#include <complex>
#include <utility>
using namespace std;
typedef long long LL;
#define INF 0x3fffffff
#define Maxn 100010int num[Maxn<<1];
int f[Maxn][2];int n,m;int a[Maxn],b[Maxn];#define L(u) u<<1
#define R(u) u<<1|1struct Tnode{int l,r;bool isset;int set;
};
Tnode tr[Maxn<<3];void build(int u,int l,int r)
{tr[u].l = l; tr[u].r = r;tr[u].isset = true; tr[u].set = 0;if(l<r){int mid = (l+r)>>1;build(L(u),l,mid);build(R(u),mid+1,r);}
}void pushdown(int u)
{if(tr[u].isset){tr[L(u)].isset = tr[R(u)].isset = true;tr[L(u)].set = tr[R(u)].set = tr[u].set;tr[u].isset = tr[u].set = 0;}
}void update(int u,int l,int r,int val)
{if(l<=tr[u].l && tr[u].r<=r){tr[u].isset = true;tr[u].set = val;return;}pushdown(u);int mid = (tr[u].l+tr[u].r)>>1;if(mid>=l) update(L(u),l,r,val);if(mid<r) update(R(u),l,r,val);
}int query(int u,int p)
{if(tr[u].l==tr[u].r)return tr[u].set;pushdown(u);int mid = (tr[u].l+tr[u].r)>>1;if(p<=mid) return query(L(u),p);else return query(R(u),p);
}int main()
{   scanf("%d%d",&n,&m);build(1,1,Maxn<<1);a[n+1] = b[n+1] = m;for(int i=1;i<=n;i++)scanf("%d%d",&a[i],&b[i]);int k1,k2;for(int i=1;i<=n+1;i++){k1 = query(1,a[i]+100005);k2 = query(1,b[i]+100005);f[i][0] = min(f[k1][0]+abs(a[i]-a[k1]),f[k1][1]+abs(a[i]-b[k1]));f[i][1] = min(f[k2][0]+abs(b[i]-a[k2]),f[k2][1]+abs(b[i]-b[k2]));if(a[i]+1<b[i])update(1,a[i]+100005+1,b[i]+100005-1,i);}printf("%d\n",f[n+1][0]);return 0;
}

转载于:https://www.cnblogs.com/ouqingliang/p/9245248.html

BZOJ3387栅栏行动相关推荐

  1. BZOJ3387栅栏(另一种解法:spfa)

    题目描述 + 讲解 经典例题了,常规解法是 用线段树优化dp数组,dp很好想,线段树优化难写. 这里我给出另一种解法,最短路spfa.(也不好想) 因为只要求x轴上的运动路径.所以只有栅栏的边界是有用 ...

  2. 【BZOJ3387】[Usaco2004 Dec]Fence Obstacle Course栅栏行动 线段树

    [BZOJ3387][Usaco2004 Dec]Fence Obstacle Course栅栏行动 Description 约翰建造了N(1≤N≤50000)个栅栏来与牛同乐.第i个栅栏的z坐标为[ ...

  3. usaco Overfencing 穿越栅栏(BFS)

    Overfencing 穿越栅栏 农夫 John 在外面的田野上搭建了一个巨大的用栅栏围成的迷宫.幸运的是,他在迷宫的边界上留出 了两段栅栏作为迷宫的出口.更幸运的是,他所建造的迷宫是一个" ...

  4. 【CTF】实验吧 困在栅栏里的凯撒

    题目先提到栅栏,再提到凯撒,按照顺序先栅栏解码,再凯撒解码. 一般密码的开头不是flag就是key或者ctf 所以选择"6栏",在进行凯撒解码 在所有组合中,发现CTF即为flag

  5. 【CTF】实验吧 围在栅栏中的爱

    对摩斯密码进行解码:kiqlwtfcqgnsoo QWE是键盘上的前三个,ABC是26个字母的前三个.所以,二者有这样的对应关系. #include <stdio.h> #include ...

  6. [SCOI2005]栅栏(贪心+二分+dfs)难度⭐⭐⭐⭐

    [SCOI2005]栅栏(贪心+二分+dfs) P2329 [SCOI2005]栅栏 题目描述 农夫约翰打算建立一个栅栏将他的牧场给围起来,因此他需要一些特定规格的木材.于是农夫约翰到木材店购买木材. ...

  7. kali linux解密栅栏密码,犯罪大师上帝之眼答案最新

    犯罪大师上帝之眼答案最新为玩家带来了最新的<上帝之眼>全部答案,并且和玩家一起解析在案件里面的全部线索.属于<犯罪大师上帝之眼答案最新>的剧情为玩家带来了非常精彩的玩法,每一条 ...

  8. Java并发包之闭锁/栅栏/信号量(转)

    本文转自http://blog.csdn.net/u010942020/article/details/79352560 感谢作者 一.Java多线程总结: 描述线程的类:Runable和Thread ...

  9. java内存栅栏_内存屏障(Memory Barriers/Fences) - 并发编程中最基础的一项技术

    我们经常都听到并发编程,但很多人都被其高大上的感觉迷惑而停留在知道听说这一层面,下面我们就来讨论并发编程中最基础的一项技术:内存屏障或内存栅栏,也就是让一个CPU处理单元中的内存状态对其它处理单元可见 ...

最新文章

  1. 【转载】数据库范式那些事
  2. vue 打包后页面空白问题
  3. 动态数据源切换的底层原理-DynamicDataSourceEntry
  4. 状态管理工具vuex的基本使用(vuebus的理解)
  5. c语言自动取款机贴吧,求助 简单atm机的循环操作
  6. 教你用Python制作一款自己的杀毒程序
  7. C++中的static 成员变量的一些注意点
  8. v-viewer图片打不开一直在刷新_网速很慢甚至打不开?广告弹窗太多了?有效提升网络质量的方法。...
  9. Prototype使用Class
  10. Java中的==符号与equals()的使用(测试两个变量是否相等)
  11. onfigure: error: cannot find install-sh, install.sh, or shtool in
  12. 2020年最新-Java集合面试题
  13. 1、锐捷交换机常用配置命令汇总,收藏备用!
  14. 如何在Github上建立自己的个人博客网站详细教程
  15. 什么是驻点和拐点_拐点和驻点的区别
  16. 【Java】动态代理原理分析
  17. c# serialPort.DataReceived无法被触发接收数据
  18. 重学设计模式 - Facade模式
  19. 读代码比写代码难,真的吗?
  20. 音频文件如何转换成MP3格式?一分钟教你搞定

热门文章

  1. thinkserver rd650管理口地址_路由器WAN口和LAN口有什么区别【区别介绍】
  2. linux重启后root密码错误,Linux技巧| 解决Debian Root密码忘记的问题
  3. 958. 二叉树的完全性检验 golang
  4. 在windows下,编译可访问https的libcurl静态库过程
  5. java静态类和非静态类的区别_Java中静态内部类和非静态内部类到底有什么区别?...
  6. 使用openssl的md5库
  7. verilator编译 更新文件的规则
  8. 《Leetcode | 02》
  9. C# 利用DotRas 操作adsl
  10. Python自动化开发01