BZOJ3387栅栏行动
首先,很容易想到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栅栏行动相关推荐
- BZOJ3387栅栏(另一种解法:spfa)
题目描述 + 讲解 经典例题了,常规解法是 用线段树优化dp数组,dp很好想,线段树优化难写. 这里我给出另一种解法,最短路spfa.(也不好想) 因为只要求x轴上的运动路径.所以只有栅栏的边界是有用 ...
- 【BZOJ3387】[Usaco2004 Dec]Fence Obstacle Course栅栏行动 线段树
[BZOJ3387][Usaco2004 Dec]Fence Obstacle Course栅栏行动 Description 约翰建造了N(1≤N≤50000)个栅栏来与牛同乐.第i个栅栏的z坐标为[ ...
- usaco Overfencing 穿越栅栏(BFS)
Overfencing 穿越栅栏 农夫 John 在外面的田野上搭建了一个巨大的用栅栏围成的迷宫.幸运的是,他在迷宫的边界上留出 了两段栅栏作为迷宫的出口.更幸运的是,他所建造的迷宫是一个" ...
- 【CTF】实验吧 困在栅栏里的凯撒
题目先提到栅栏,再提到凯撒,按照顺序先栅栏解码,再凯撒解码. 一般密码的开头不是flag就是key或者ctf 所以选择"6栏",在进行凯撒解码 在所有组合中,发现CTF即为flag
- 【CTF】实验吧 围在栅栏中的爱
对摩斯密码进行解码:kiqlwtfcqgnsoo QWE是键盘上的前三个,ABC是26个字母的前三个.所以,二者有这样的对应关系. #include <stdio.h> #include ...
- [SCOI2005]栅栏(贪心+二分+dfs)难度⭐⭐⭐⭐
[SCOI2005]栅栏(贪心+二分+dfs) P2329 [SCOI2005]栅栏 题目描述 农夫约翰打算建立一个栅栏将他的牧场给围起来,因此他需要一些特定规格的木材.于是农夫约翰到木材店购买木材. ...
- kali linux解密栅栏密码,犯罪大师上帝之眼答案最新
犯罪大师上帝之眼答案最新为玩家带来了最新的<上帝之眼>全部答案,并且和玩家一起解析在案件里面的全部线索.属于<犯罪大师上帝之眼答案最新>的剧情为玩家带来了非常精彩的玩法,每一条 ...
- Java并发包之闭锁/栅栏/信号量(转)
本文转自http://blog.csdn.net/u010942020/article/details/79352560 感谢作者 一.Java多线程总结: 描述线程的类:Runable和Thread ...
- java内存栅栏_内存屏障(Memory Barriers/Fences) - 并发编程中最基础的一项技术
我们经常都听到并发编程,但很多人都被其高大上的感觉迷惑而停留在知道听说这一层面,下面我们就来讨论并发编程中最基础的一项技术:内存屏障或内存栅栏,也就是让一个CPU处理单元中的内存状态对其它处理单元可见 ...
最新文章
- 【转载】数据库范式那些事
- vue 打包后页面空白问题
- 动态数据源切换的底层原理-DynamicDataSourceEntry
- 状态管理工具vuex的基本使用(vuebus的理解)
- c语言自动取款机贴吧,求助 简单atm机的循环操作
- 教你用Python制作一款自己的杀毒程序
- C++中的static 成员变量的一些注意点
- v-viewer图片打不开一直在刷新_网速很慢甚至打不开?广告弹窗太多了?有效提升网络质量的方法。...
- Prototype使用Class
- Java中的==符号与equals()的使用(测试两个变量是否相等)
- onfigure: error: cannot find install-sh, install.sh, or shtool in
- 2020年最新-Java集合面试题
- 1、锐捷交换机常用配置命令汇总,收藏备用!
- 如何在Github上建立自己的个人博客网站详细教程
- 什么是驻点和拐点_拐点和驻点的区别
- 【Java】动态代理原理分析
- c# serialPort.DataReceived无法被触发接收数据
- 重学设计模式 - Facade模式
- 读代码比写代码难,真的吗?
- 音频文件如何转换成MP3格式?一分钟教你搞定
热门文章
- thinkserver rd650管理口地址_路由器WAN口和LAN口有什么区别【区别介绍】
- linux重启后root密码错误,Linux技巧| 解决Debian Root密码忘记的问题
- 958. 二叉树的完全性检验 golang
- 在windows下,编译可访问https的libcurl静态库过程
- java静态类和非静态类的区别_Java中静态内部类和非静态内部类到底有什么区别?...
- 使用openssl的md5库
- verilator编译 更新文件的规则
- 《Leetcode | 02》
- C# 利用DotRas 操作adsl
- Python自动化开发01