考试压轴题,意识到这题是线段树优化 \(dp\) 时追悔莫及。

为了简化题目,我将从起点到原点变成了从原点到起点(这样就可以省去两个数组的空间)。

想到设 \(dp_{i,j}\) 表示在第 \(i\) 层,奶牛们在 \(j\) 列时的最小移动范围,则转移方程为(设输入为 \(l,r\)):

\[\begin{cases}
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 围栏障碍训练场 题解的更多相关文章

  1. AcWing 329. 围栏障碍训练场

    大型补档计划 题目链接 考虑模拟这个过程. \(f[i][0 / 1]\) 表示从第 \(i\) 个围栏的 左/右端点开始往下走,走到原点的最小花费. 转移很容易想到,就是考虑找到一个往下走第一个碰到 ...

  2. [TCO2013]Block3Checkers

    题意:一个网格上有一些障碍和$3$个在网格边界上的棋子,你要添加一些障碍使得没有两个棋子四连通,问最少添加多少个障碍 官方题解——一张图教你做人... 三个棋子将网格边界分成三段,添加障碍后网格中一定 ...

  3. BZOJ1591 & 洛谷2924:[USACO2008 DEC]Largest Fence 最大的围栏——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=1591 https://www.luogu.org/problemnew/show/P2924#sub ...

  4. [USACO07OCT]障碍路线 & yzoj P1130 拐弯 题解

    题意 给出n* n 的图,A为起点,B为终点,* 为障碍,.可以行走,问最少需要拐90度的弯多少次,无法到达输出-1. 解析 思路:构造N * M * 4个点,即将原图的每个点分裂成4个点.其中点(i ...

  5. ACM/ICPC 之 BFS-简单障碍迷宫问题(POJ2935)

    题目确实简单,思路很容易出来,难点在于障碍的记录,是BFS迷宫问题中很经典的题目了. POJ2935-Basic Wall Maze 题意:6*6棋盘,有三堵墙,求从给定初始点到给定终点的最短路,输出 ...

  6. 2016多校第六场题解(hdu5793&hdu5794&hdu5795&hdu5800&hdu5802)

    这场就做出一道题,怎么会有窝这么辣鸡的人呢? 1001 A Boring Question(hdu 5793) 很复杂的公式,打表找的规律,最后是m^0+m^1+...+m^n,题解直接是(m^(n+ ...

  7. UVA 1600 Patrol Robot(机器人穿越障碍最短路线BFS)

    UVA 1600 Patrol Robot   Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu   ...

  8. BZOJ 1644: [Usaco2007 Oct]Obstacle Course 障碍训练课

    题目 1644: [Usaco2007 Oct]Obstacle Course 障碍训练课 Time Limit: 5 Sec  Memory Limit: 64 MB Description 考虑一 ...

  9. 1644: [Usaco2007 Oct]Obstacle Course 障碍训练课

    1644: [Usaco2007 Oct]Obstacle Course 障碍训练课 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 383  Solved ...

  10. “盛大游戏杯”第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 描述 在一个矩形的灰度图像上,每个 ...

随机推荐

  1. PLC编程—编程语言

    LAD:图形编程语言(电路图表示法--梯形图). FBD:图形编程语言(电路系统表示法--功能块图). SCL:结构化编程语言之一. STL:文本编程语言. 常用的指令 位.定时.计数.比较.数学.赋 ...

  2. QPixmap 线程 奔溃

    使用QImage替代QPixmap. ·QImage与Qpixmap的区别 1.QPixmap主要是用于绘图,针对屏幕显示而最佳化设计,QImage主要是为图像I/O.图片访问和像素修改而设计的 2. ...

  3. 一款基于 .NET MVC 框架开发、功能全面的MES系统

    前言 今天大姚给大家分享一款基于 .NET MVC 框架开发.功能全面的离散型零部件制造管理系统(MES):EasyMES. 项目介绍 EasyMES一款基于 .NET 6 MVC 框架开发.开源免费 ...

  4. 在 K8S 中创建 Pod 是如何使用到 GPU 的: nvidia device plugin 源码分析

    本文主要分析了在 K8s 中创建一个 Pod 并申请 GPU 资源,最终该 Pod 时怎么能够使用 GPU 的,具体的实现原理,以及 device plugin.nvidia-container-to ...

  5. 测试覆盖率 Java 覆盖率 Jacoco 插桩的不同形式总结和踩坑记录

    https://testerhome.com/topics/20632 关于Jacoco的小结和踩坑记录 一.概述 测试覆盖率,老生常谈的话题.因为我测试理论基础不是很好,就不提什么需求覆盖率啦这样那 ...

  6. Qt/C++入门基础学习001-绘图基础

    这一节介绍 Qt 的绘图基础知识,我们都知道,Qt 里绘图使用的是 QPainter,但是首先需要弄明白:在什么上绘图和在哪里绘图,然后才是怎么绘图,我们就围绕这几个问题来展开. 在什么上绘图 The ...

  7. Qt数据库应用22-文件编码格式识别

    一.前言 在做数据导入导出的过程中,如果应用场景多了,相信各位都会遇到一个问题就是文件编码的问题,有些文件是ANSI编码,有些是utf8编码,有些又是utf8带bom编码,不同的文件编码如果都用同一种 ...

  8. Qt开源作品13-三套样式表

    一.前言 在做各种各样的项目中,难免遇到需要设定自己界面风格样式的时候,而Qt提供的qss就是牛逼的为了实现定制各种各样的皮肤的,其实一个完美的UI界面,主要由两大块组成,一个是颜色搭配,一个是布局, ...

  9. .NET 响应式编程 System.Reactive 系列文章(二):深入理解 IObservable<T> 和 IObserver<T>

    .NET 响应式编程 System.Reactive 系列文章(二):深入理解 IObservable<T> 和 IObserver<T> 引言:为什么我们调整了学习顺序? 在 ...

  10. .NET Core:架构、特性和优势详解

    .NET Core:架构.特性和优势详解 在软件开发领域,保持领先地位至关重要.随着技术以指数级的速度发展,开发人员不断寻求高效.可扩展且多功能的解决方案来应对现代挑战..NET Core 就是这样一 ...