【BZOJ3387】[Usaco2004 Dec]Fence Obstacle Course栅栏行动

Description

约翰建造了N(1≤N≤50000)个栅栏来与牛同乐.第i个栅栏的z坐标为[Ai.,Bi](-100000≤Ai<Bi≤10^5),y坐标为i.牛棚的外栏即x轴,原点是牛棚的门.奶牛们开始处于(S,N),她们需要回到牛棚的门(下图中用“*’表示).
约翰的初衷是为了给奶牛们练习跳跃,但是奶牛们似乎更愿意四蹄着地,慢慢她沿着栅栏
走.当她们走到栅栏的尽头,就会朝着牛棚的个栏方向(即y轴负方向)行走,直到碰上另一条栅栏或是牛棚外栏.这时候她们便要选择继续向左走,还是向右走.奶牛们希望走的路程最短.由于可方向的路程一定,你只需求出z方向走的最短路程,使奶牛回到原点.

Input

第1行:N,S(-100000≤S≤100000).
第2到N+1行:每行2个整数Ai,Bi,(-100000≤Ai≤Bi≤100000).

Output

最小的x方向的步数

Sample Input

4 0
-2 1
-1 2
-3 0
-2 1

Sample Output

4

HINT

题解:本题做法有很多。我是先列了个朴素的方程,设f[i][0/1]表示走到第i个栅栏左/右边界的最小路程,转移如下

然后就根据绝对值分两种情况讨论,每个都建一个线段树维护一下就好了

注意此题从(S,N)开始!

#include <cstdio>
#include <iostream>
#include <cstring>
#define lson x<<1
#define rson x<<1|1
using namespace std;
const int maxn=200005;
int n,m;
int s[maxn<<2][2],t[maxn<<2][2];
void pushdown(int x,int p)
{if(t[x][p]){s[lson][p]=s[rson][p]=1<<30;t[lson][p]=t[rson][p]=1;t[x][p]=0;}
}
void updata(int l,int r,int x,int a,int b,int p)
{if(l==r){s[x][p]=min(s[x][p],b);return ;}pushdown(x,p);int mid=l+r>>1;if(a<=mid)    updata(l,mid,lson,a,b,p);else   updata(mid+1,r,rson,a,b,p);s[x][p]=min(s[lson][p],s[rson][p]);
}
void cover(int l,int r,int x,int a,int b,int p)
{if(a<=l&&r<=b){t[x][p]=1,s[x][p]=1<<30;return ;}pushdown(x,p);int mid=l+r>>1;if(a<=mid)    cover(l,mid,lson,a,b,p);if(b>mid)    cover(mid+1,r,rson,a,b,p);s[x][p]=min(s[lson][p],s[rson][p]);
}
int query(int l,int r,int x,int a,int b,int p)
{if(a<=l&&r<=b) return s[x][p];pushdown(x,p);int mid=l+r>>1;if(b<=mid)  return query(l,mid,lson,a,b,p);if(a>mid) return query(mid+1,r,rson,a,b,p);return min(query(l,mid,lson,a,b,p),query(mid+1,r,rson,a,b,p));
}
int main()
{scanf("%d%d",&n,&m);m+=100002;memset(s,0x3f,sizeof(s));updata(1,maxn,1,100002,-100002,0),updata(1,maxn,1,100002,100002,1);int i,a,b,ta,tb;for(i=1;i<=n;i++){scanf("%d%d",&a,&b);a+=100002,b+=100002;ta=min(query(1,maxn,1,1,a,0)+a,query(1,maxn,1,a+1,maxn,1)-a);tb=min(query(1,maxn,1,1,b,0)+b,query(1,maxn,1,b+1,maxn,1)-b);updata(1,maxn,1,a,ta-a,0),updata(1,maxn,1,a,ta+a,1);updata(1,maxn,1,b,tb-b,0),updata(1,maxn,1,b,tb+b,1);if(b>a+1)   cover(1,maxn,1,a+1,b-1,0),cover(1,maxn,1,a+1,b-1,1);}printf("%d",min(query(1,maxn,1,1,m,0)+m,query(1,maxn,1,m+1,maxn,1)-m));return 0;
}

转载于:https://www.cnblogs.com/CQzhangyu/p/6421252.html

【BZOJ3387】[Usaco2004 Dec]Fence Obstacle Course栅栏行动 线段树相关推荐

  1. 1672: [Usaco2005 Dec]Cleaning Shifts 清理牛棚 DP + 线段树 / SPFA

    1672: [Usaco2005 Dec]Cleaning Shifts 清理牛棚 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 975  Solved ...

  2. [BZOJ5139][Usaco2017 Dec]Greedy Gift Takers 权值线段树

    Description Farmer John's nemesis, Farmer Nhoj, has NN cows (1≤N≤10^5), conveniently numbered 1-N. T ...

  3. bzoj 3388: [Usaco2004 Dec]Cow Ski Area雪场缆车(Tarjan)

    3388: [Usaco2004 Dec]Cow Ski Area雪场缆车 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 108  Solved: 4 ...

  4. poj 2376 bzoj 3389: [Usaco2004 Dec]Cleaning Shifts安排值班(贪心)

    3389: [Usaco2004 Dec]Cleaning Shifts安排值班 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 462  Solved ...

  5. bzoj 3391: [Usaco2004 Dec]Tree Cutting网络破坏

    3391: [Usaco2004 Dec]Tree Cutting网络破坏 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 296  Solved: 2 ...

  6. bzoj3390[Usaco2004 Dec]Bad Cowtractors牛的报复*

    bzoj3390[Usaco2004 Dec]Bad Cowtractors牛的报复 题意: 最大生成树. 题解: 最大生成树. 代码: 1 #include <cstdio> 2 #in ...

  7. bzoj3391[Usaco2004 Dec]Tree Cutting网络破坏*

    bzoj3391[Usaco2004 Dec]Tree Cutting网络破坏 题意: 给一棵树,问去掉哪个点后可以使剩下的每个子树大小都小于等于节点总数的一半.n≤10000. 题解: dfs的时候 ...

  8. E. Sign on Fence(整体二分 + 线段树维护区间最大连续 1 的个数)

    E. Sign on Fence 给定一个长度为nnn的数组aaa,1≤ai≤1091 \leq a_i \leq 10 ^ 91≤ai​≤109,有mmm次询问,每次给定l,r,kl, r, kl, ...

  9. 【BZOJ4094】[Usaco2013 Dec]Optimal Milking 线段树

    [BZOJ4094][Usaco2013 Dec]Optimal Milking Description Farmer John最近购买了N(1 <= N <= 40000)台挤奶机,编号 ...

最新文章

  1. AS插件-Android Drawable Importer
  2. Ubuntu常用终端快捷键
  3. android TextView 的垂直滚动
  4. Matalab类定义
  5. android 模拟器read-only file system,WAC启动Android模拟器 transfer error: Read-only file system错误解决方法...
  6. PHP笔记-AES加解密(PHP7)
  7. 下载并导入mysql提供的测试数据库employees
  8. [算法][包围盒]AABB简单类
  9. 怎么在mac上更改移动硬盘的权限
  10. 进入linux jed文本编辑怎么退出,尝试将 Jed 作为你的 Linux 终端文本编辑器 | Linux 中国...
  11. csv 导入iphone通讯录
  12. springboot整合规则引擎URule
  13. Qt - 抽签小工具源码
  14. 国内某厂商摄像头敏感信息泄露漏洞事件分析
  15. 微信小程序php签到功能,小程序签到功能的作用
  16. Dev C++ 英文模式改成中文模式
  17. iOS开发:如何使用ShareSDK让APP快速拥有分享功能
  18. 福昕 关闭互联PDF
  19. MySQL-SQL注入,导入,导出
  20. 图形学(1)概论及一些基础知识

热门文章

  1. JavaScript实现排序算法
  2. 为什么有必要对网站开启https?
  3. 通向架构师的道路(第十七天)IBM Websphere集群探秘-WASND
  4. DNN 4.x CodeSmith模板
  5. Android全局对象Application的使用,以及如何在任何地方得到Application全局对象
  6. ubuntu adb 调试手机
  7. WebKit Frame对象分析
  8. 如何解决在onCreate()中获取View的width和Height为0?
  9. linux动态链接库
  10. stream的filter用法