acwing329 围栏障碍训练场 题解
考试压轴题,意识到这题是线段树优化 \(dp\) 时追悔莫及。
为了简化题目,我将从起点到原点变成了从原点到起点(这样就可以省去两个数组的空间)。
想到设 \(dp_{i,j}\) 表示在第 \(i\) 层,奶牛们在 \(j\) 列时的最小移动范围,则转移方程为(设输入为 \(l,r\)):
dp_{i,j}=dp_{i-1,j}\ (j\ne l,r)\\
dp_{i,l}=\min(dp_{i-1,l},\min\limits_{k=l+1}^{r-1}(dp_{i-1,k}+k-l))\\
dp_{i,r}=\min(dp_{i-1,r},\min\limits_{k=l+1}^{r-1}(dp_{i-1,k}+r-k))
\end{cases}
\]
发现可以通过线段树优化 \(dp\),时间复杂度 \(O(n\log_2 2\times 10^5)\)。
#include<bits/stdc++.h>
#define ll long long
#define ls(x) x*2
#define rs(x) x*2+1
using namespace std;
const int N=2e6+5;
int n,s,lb[N];
int lmn[N],rmn[N];
void push_down(int x){
if(!lb[x]) return;
lb[ls(x)]=lb[rs(x)]=1;
lmn[ls(x)]=rmn[ls(x)]=1e9;
lmn[rs(x)]=rmn[rs(x)]=1e9;
lb[x]=0;return;
}void build(int x,int l,int r){
lmn[x]=rmn[x]=1e9;
if(l==r) return;
build(ls(x),l,(l+r-1)/2);
build(rs(x),(l+r-1)/2+1,r);
}void add(int x,int l,int r,int a,int k){
if(l==r){
lb[x]=0;lmn[x]=min(lmn[x],k);
rmn[x]=min(rmn[x],k);return;
}push_down(x);int m=(l+r-1)/2;
if(a<=m) add(ls(x),l,m,a,k);
else add(rs(x),m+1,r,a,k);
lmn[x]=min(lmn[ls(x)],lmn[rs(x)]+m-l+1);
rmn[x]=min(rmn[ls(x)]+r-m,rmn[rs(x)]);
}int lmin(int x,int l,int r,int L,int R){
if(L<=l&&r<=R) return lmn[x];
push_down(x);int m=(l+r-1)/2;
if(R<=m) return lmin(ls(x),l,m,L,R);
if(L>m) return lmin(rs(x),m+1,r,L,R);
int lm=lmin(ls(x),l,m,L,R);
int rm=lmin(rs(x),m+1,r,m+1,R);
return min(lm,rm+m-L+1);
}int rmin(int x,int l,int r,int L,int R){
if(L<=l&&r<=R) return rmn[x];
push_down(x);int m=(l+r-1)/2;
if(R<=m) return rmin(ls(x),l,m,L,R);
if(L>m) return rmin(rs(x),m+1,r,L,R);
int lm=rmin(ls(x),l,m,L,m);
int rm=rmin(rs(x),m+1,r,L,R);
return min(lm+R-m,rm);
}void turn(int x,int l,int r,int L,int R){
if(L<=l&&r<=R){
lmn[x]=rmn[x]=1e9;
lb[x]=1;return;
}push_down(x);int m=(l+r-1)/2;
if(L<=m) turn(ls(x),l,m,L,R);
if(R>m) turn(rs(x),m+1,r,L,R);
}int que(int x,int l,int r,int a){
if(l==r) return lmn[x];
int m=(l+r-1)/2;
if(a<=m) return que(ls(x),l,m,a);
return que(rs(x),m+1,r,a);
}int main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n>>s;
build(1,-1e5,1e5);
add(1,-1e5,1e5,0,0);
for(int i=1;i<=n;i++){
int l,r;cin>>l>>r;
if(l+2>r) continue;
int lm=lmin(1,-1e5,1e5,l+1,r-1);
int rm=rmin(1,-1e5,1e5,l+1,r-1);
turn(1,-1e5,1e5,l+1,r-1);
add(1,-1e5,1e5,l,lm+1);
add(1,-1e5,1e5,r,rm+1);
}int lm=lmin(1,-1e5,1e5,s+1,1e5);
int rm=rmin(1,-1e5,1e5,-1e5,s-1);
add(1,-1e5,1e5,s,min(lm,rm)+1);
cout<<que(1,-1e5,1e5,s);
return 0;
}
acwing329 围栏障碍训练场 题解的更多相关文章
- AcWing 329. 围栏障碍训练场
大型补档计划 题目链接 考虑模拟这个过程. \(f[i][0 / 1]\) 表示从第 \(i\) 个围栏的 左/右端点开始往下走,走到原点的最小花费. 转移很容易想到,就是考虑找到一个往下走第一个碰到 ...
- [TCO2013]Block3Checkers
题意:一个网格上有一些障碍和$3$个在网格边界上的棋子,你要添加一些障碍使得没有两个棋子四连通,问最少添加多少个障碍 官方题解——一张图教你做人... 三个棋子将网格边界分成三段,添加障碍后网格中一定 ...
- BZOJ1591 & 洛谷2924:[USACO2008 DEC]Largest Fence 最大的围栏——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=1591 https://www.luogu.org/problemnew/show/P2924#sub ...
- [USACO07OCT]障碍路线 & yzoj P1130 拐弯 题解
题意 给出n* n 的图,A为起点,B为终点,* 为障碍,.可以行走,问最少需要拐90度的弯多少次,无法到达输出-1. 解析 思路:构造N * M * 4个点,即将原图的每个点分裂成4个点.其中点(i ...
- ACM/ICPC 之 BFS-简单障碍迷宫问题(POJ2935)
题目确实简单,思路很容易出来,难点在于障碍的记录,是BFS迷宫问题中很经典的题目了. POJ2935-Basic Wall Maze 题意:6*6棋盘,有三堵墙,求从给定初始点到给定终点的最短路,输出 ...
- 2016多校第六场题解(hdu5793&hdu5794&hdu5795&hdu5800&hdu5802)
这场就做出一道题,怎么会有窝这么辣鸡的人呢? 1001 A Boring Question(hdu 5793) 很复杂的公式,打表找的规律,最后是m^0+m^1+...+m^n,题解直接是(m^(n+ ...
- UVA 1600 Patrol Robot(机器人穿越障碍最短路线BFS)
UVA 1600 Patrol Robot Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu ...
- BZOJ 1644: [Usaco2007 Oct]Obstacle Course 障碍训练课
题目 1644: [Usaco2007 Oct]Obstacle Course 障碍训练课 Time Limit: 5 Sec Memory Limit: 64 MB Description 考虑一 ...
- 1644: [Usaco2007 Oct]Obstacle Course 障碍训练课
1644: [Usaco2007 Oct]Obstacle Course 障碍训练课 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 383 Solved ...
- “盛大游戏杯”第15届上海大学程序设计联赛夏季赛暨上海高校金马五校赛题解&&源码【A,水,B,水,C,水,D,快速幂,E,优先队列,F,暴力,G,贪心+排序,H,STL乱搞,I,尼姆博弈,J,差分dp,K,二分+排序,L,矩阵快速幂,M,线段树区间更新+Lazy思想,N,超级快速幂+扩展欧里几德,O,BFS】
黑白图像直方图 发布时间: 2017年7月9日 18:30 最后更新: 2017年7月10日 21:08 时间限制: 1000ms 内存限制: 128M 描述 在一个矩形的灰度图像上,每个 ...
随机推荐
- zustand:基于hooks的react状态管理
react的状态管理 状态(State)是 React 中用于存储组件数据的特殊对象,它可以影响组件的渲染输出.状态管理的核心目标是确保数据的一致性.可预测性以及组件之间的数据流. 每个 React ...
- 禁用SAP Hana错误密码锁定用户功能
背景 公司项目适配多种数据库其中包含SAP Hana,由于有同事的数据库连接工具保存了某个在用的数据库的旧密码,导致时不时会被锁用户.通过查询官方文档已解决,这里统一记录一下. 禁用密码锁定方法 以下 ...
- PowerShell一键下载Nuget某个包的所有版本
一转眼好几年没有写博客了,来博客园冒个泡,最近由于工作需要,内网办公,幸运的是只需要上传一个*.nupkg一个包信息就可以在私有nuget下载到了,下面就用PowerShell编写下载脚本,需要注意的 ...
- ArkTs布局入门05——栅格布局(GridRow/GridCol)
1.概述 栅格布局是一种通用的辅助定位工具,对移动设备的界面设计有较好的借鉴作用.主要优势包括: 提供可循的规律:栅格布局可以为布局提供规律性的结构,解决多尺寸多设备的动态布局问题.通过将页面划分为等 ...
- vscode+evernote印象笔记+markdown写在线笔记
1. vscode安装evermonkey插件 2. vscode快捷键:Ctrl+Shift+P ,输入ever 按提示进行操作 Ever New: 创建新evernote笔记: 愉快地玩耍 点击下 ...
- 【转载】 《SpringBoot2.0 实战》系列-集成Quartz定时任务(持久化到数据库)
https://blog.csdn.net/HXNLYW/article/details/95055601 一.增加依赖 我们使用的spring-boot-starter-quartz,所以不用显示指 ...
- 测试覆盖率 Java 覆盖率 Jacoco 插桩的不同形式总结和踩坑记录
https://testerhome.com/topics/20632 关于Jacoco的小结和踩坑记录 一.概述 测试覆盖率,老生常谈的话题.因为我测试理论基础不是很好,就不提什么需求覆盖率啦这样那 ...
- 永久告别mac屏幕涂层脱落
转载:https://www.feng.com/post/11380203 我从2011年开始使用Mac book pro电脑,到现在的2016款已经是第三台了,我从来都不会被涂层脱落这个问题困扰,我 ...
- Qt/C++地图雷达扫描/动态扇形区域/标记线实时移动/轮船货轮动态轨迹/雷达模拟/跟随地图缩放
一.前言说明 地图雷达扫描的需求场景也不少,很多人的做法是直接搞个覆盖层widget,在widget上绘制雷达,优缺点很明显,优点是性能高,毕竟直接在widget上绘制性能明显比js中绘制要高,缺点是 ...
- Qt自定义控件大全文章导航
文章 链接 Qt编写自定义控件1-汽车仪表盘 https://qtchina.blog.csdn.net/article/details/89407746 Qt编写自定义控件2-进度条标尺 https ...