【BZOJ3387】[Usaco2004 Dec]Fence Obstacle Course栅栏行动 线段树
【BZOJ3387】[Usaco2004 Dec]Fence Obstacle Course栅栏行动
Description
Input
Output
Sample Input
-2 1
-1 2
-3 0
-2 1
Sample Output
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栅栏行动 线段树相关推荐
- 1672: [Usaco2005 Dec]Cleaning Shifts 清理牛棚 DP + 线段树 / SPFA
1672: [Usaco2005 Dec]Cleaning Shifts 清理牛棚 Time Limit: 5 Sec Memory Limit: 64 MB Submit: 975 Solved ...
- [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 ...
- 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 ...
- poj 2376 bzoj 3389: [Usaco2004 Dec]Cleaning Shifts安排值班(贪心)
3389: [Usaco2004 Dec]Cleaning Shifts安排值班 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 462 Solved ...
- bzoj 3391: [Usaco2004 Dec]Tree Cutting网络破坏
3391: [Usaco2004 Dec]Tree Cutting网络破坏 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 296 Solved: 2 ...
- bzoj3390[Usaco2004 Dec]Bad Cowtractors牛的报复*
bzoj3390[Usaco2004 Dec]Bad Cowtractors牛的报复 题意: 最大生成树. 题解: 最大生成树. 代码: 1 #include <cstdio> 2 #in ...
- bzoj3391[Usaco2004 Dec]Tree Cutting网络破坏*
bzoj3391[Usaco2004 Dec]Tree Cutting网络破坏 题意: 给一棵树,问去掉哪个点后可以使剩下的每个子树大小都小于等于节点总数的一半.n≤10000. 题解: dfs的时候 ...
- 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, ...
- 【BZOJ4094】[Usaco2013 Dec]Optimal Milking 线段树
[BZOJ4094][Usaco2013 Dec]Optimal Milking Description Farmer John最近购买了N(1 <= N <= 40000)台挤奶机,编号 ...
最新文章
- AS插件-Android Drawable Importer
- Ubuntu常用终端快捷键
- android TextView 的垂直滚动
- Matalab类定义
- android 模拟器read-only file system,WAC启动Android模拟器 transfer error: Read-only file system错误解决方法...
- PHP笔记-AES加解密(PHP7)
- 下载并导入mysql提供的测试数据库employees
- [算法][包围盒]AABB简单类
- 怎么在mac上更改移动硬盘的权限
- 进入linux jed文本编辑怎么退出,尝试将 Jed 作为你的 Linux 终端文本编辑器 | Linux 中国...
- csv 导入iphone通讯录
- springboot整合规则引擎URule
- Qt - 抽签小工具源码
- 国内某厂商摄像头敏感信息泄露漏洞事件分析
- 微信小程序php签到功能,小程序签到功能的作用
- Dev C++ 英文模式改成中文模式
- iOS开发:如何使用ShareSDK让APP快速拥有分享功能
- 福昕 关闭互联PDF
- MySQL-SQL注入,导入,导出
- 图形学(1)概论及一些基础知识