P3438 [POI2006]ZAB-Frogs
给出一个不一样的解法。不需要用到斜率优化等高级算法。
下文记 \(n=w_x,m=w_y\)。
首先,答案显然满足可二分性,因此二分答案 \(d\in [0,nm]\) 确定距离的平方。
这样我们将题目转化为:求起点到终点之间是否有一条路径使得任何一个点都不被圆心是整点且半径相同的若干个圆所覆盖。记 \(r=\sqrt d\)。如果处理出一个点是否被覆盖,那么可以 \(\mathcal{O}(nm)\) BFS 求出答案。
枚举每一竖列即 \(x\),显然覆盖到该列的圆的圆心 \(x_i\) 坐标满足 \((x_i-x)^2\leq d\) 即 \(x_i-r\leq x\leq x_i+r\)。将所有圆按照 \(x_i\) 从小到大排序,Two-pointers 维护即可。
如果直接考虑一个点被覆盖的圆会很难做。不妨转换思路,枚举能够覆盖这一竖列的所有圆,记圆心为 \((x_i,y_i)\ (x_i-r\leq x\leq x_i+r)\)。显然,它能覆盖到的第 \(x\) 列的所有点的纵坐标 \(y\) 形成了一段区间。差分计算线段覆盖即可。
当然这么做显然是过不去的,因为一共有 \(m\) 列,而枚举到的圆的个数为 \(\mathcal{O}(nm)\)。因此时间复杂度为 \(nm^2\log(nm)\)。
考虑优化上面的算法。注意到在枚举所有圆时,如果出现两个圆 \((x_1,y_1)\) 和 \((x_2,y_2)\) 满足 \(y_1=y_2\) 且 \(|x_1-x|>|x_2-x|\),那么我们根本不需要考虑第一个圆 \((x_1,y_1)\),因为它能覆盖到的第 \(x\) 列的所有点包含于 \((x_2,y_2)\) 能覆盖到的第 \(x\) 列的所有点。这是很显然的,因为前者的 \(y\) 需要满足 \(|y-y_1|\leq \sqrt {d-(x_1-x)^2}\),后者的 \(y\) 需要满足 \(|y-y_2|\leq \sqrt {d-(x_2-x)^2}\),而 \(\sqrt {d-(x_1-x)^2}<\sqrt {d-(x_2-x)^2}\)。
因此,对于每一行 \(y\),维护圆心纵坐标为 \(y\) 且与当前 \(x\) 距离最小的圆,那么最终我们只需枚举 \(\mathcal{O}(n)\) 个圆即可。具体地,维护 \(n\) 个存横坐标 \(x_i\) 的队列,在 Two-pointers 添加或删除一个圆 \((x_i,y_i)\) 时,对第 \(y_i\) 个队列进行添加或删除操作即可。此外,移动到下一列 \(x\gets x+1\) 时,不断弹出每个队的队首元素直至队列只剩下一个元素或队列队首横坐标与 \(x+1\) 的距离小于队首下一个横坐标与 \(x+1\) 的距离。
时间复杂度为 \(\mathcal{O}(nm\log (nm))\)。
#include <bits/stdc++.h>
using namespace std;
#define gc getchar()
#define pii pair <int,int>
#define fi first
#define se second
#define mem(x,v) memset(x,v,sizeof(x))
inline int read(){
int x=0,sign=0; char s=gc;
while(!isdigit(s))sign|=s=='-',s=gc;
while(isdigit(s))x=(x<<1)+(x<<3)+(s-'0'),s=gc;
return sign?-x:x;
}
const int N=1e3+5;
int n,m,leg[N][N];
int stx,sty,edx,edy,num;
struct point{
int x,y;
}p[N*N],mp[N][N];
bool vis[N][N];
pii q[N*N];
bool bfs(){
if(vis[stx][sty]==1)return 0;
int h=1,tl=0; q[++tl]={stx,sty},vis[stx][sty]=1;
while(h<=tl){
int x=q[h].fi,y=q[h++].se;
if(x==edx&&y==edy)return 1;
if(!vis[x+1][y])vis[x+1][y]=1,q[++tl]={x+1,y};
if(!vis[x-1][y])vis[x-1][y]=1,q[++tl]={x-1,y};
if(!vis[x][y+1])vis[x][y+1]=1,q[++tl]={x,y+1};
if(!vis[x][y-1])vis[x][y-1]=1,q[++tl]={x,y-1};
} return 0;
}
int dist(int a,int b,int c,int d){return (a-c)*(a-c)+(b-d)*(b-d);}
int d[N][N],hd[N],len[N],s[N];
void add(point x){d[x.y][len[x.y]++]=x.x;}
void del(point x){if(d[x.y][hd[x.y]]==x.x)hd[x.y]++;}
void update(int y,int x){while(d[y][hd[y]+1]&&abs(d[y][hd[y]]-x)>=abs(d[y][hd[y]+1]-x))hd[y]++;}
bool check(int x){
int dis=sqrt(x);
mem(vis,0),mem(d,0),mem(hd,0),mem(len,0);
for(int i=0;i<=max(n,m);i++)vis[0][i]=vis[i][0]=vis[n+1][i]=vis[i][m+1]=1;
for(int i=1,l=1,r=1;i<=n;i++,mem(s,0)){
while(r<=num&&i+dis>=p[r].x)add(p[r++]);
while(l<=num&&i-dis>p[l].x)del(p[l++]);
for(int j=1;j<=m;j++){
update(j,i); int xx=d[j][hd[j]];
if(!xx)continue;
int radius=sqrt(x-(xx-i)*(xx-i)),l=j-radius,r=j+radius+1;
s[max(1,l)]++,s[min(m+1,r)]--;
} for(int j=1;j<=m;j++)vis[i][j]=(s[j]+=s[j-1])>0;
} return bfs();
}
int main(){
cin>>n>>m>>stx>>sty>>edx>>edy>>num;
for(int i=1;i<=num;i++)p[i].x=read(),p[i].y=read(),mp[p[i].x][p[i].y]=p[i];
for(int i=1,cnt=0;i<=n;i++)for(int j=1;j<=m;j++)if(mp[i][j].x!=0)p[++cnt]=mp[i][j];
int l=-1,r=2e6;
while(l<r){
int m=(l+r>>1)+1;
check(m)?l=m:r=m-1;
} cout<<l+1<<endl;
return 0;
}
P3438 [POI2006]ZAB-Frogs的更多相关文章
- 洛谷 P3438 - [POI2006]ZAB-Frogs(乱搞/李超线段树)
题面传送门 首先一眼二分答案,我们假设距离 \((i,j)\) 最近的 scarefrog 离它的距离为 \(mn_{i,j}\),那么当我们二分到 \(mid\) 时我们显然只能经过 \(mn_{i ...
- 分布式系统理论进阶 - Raft、Zab
引言 <分布式系统理论进阶 - Paxos>介绍了一致性协议Paxos,今天我们来学习另外两个常见的一致性协议——Raft和Zab.通过与Paxos对比,了解Raft和Zab的核心思想.加 ...
- paxos(chubby) vs zab(Zookeeper)
参考: Zookeeper的一致性协议:Zab Chubby&Zookeeper原理及在分布式环境中的应用 Paxos vs. Viewstamped Replication vs. Zab ...
- ZooKeeper之ZAB协议
ZooKeeper为高可用的一致性协调框架,自然的ZooKeeper也有着一致性算法的实现,ZooKeeper使用的是ZAB协议作为数据一致性的算法,ZAB(ZooKeeper Atomic Broa ...
- POJ 1659 Frogs' Neighborhood(Havel-Hakimi定理)
题目链接: 传送门 Frogs' Neighborhood Time Limit: 5000MS Memory Limit: 10000K Description 未名湖附近共有N个大小湖泊L ...
- CF# Educational Codeforces Round 3 F. Frogs and mosquitoes
F. Frogs and mosquitoes time limit per test 2 seconds memory limit per test 512 megabytes input stan ...
- 第三章 深入 ZAB 协议
上一节介绍了ZAB协议的内容,本节将从系统模型.问题描述.算法描述和运行分析四方面来深入了解 ZAB 协议. 系统模型 在一个由一组进程 n ={P1,P2,...Pn}组成的分布式系统中,每一个进程 ...
- 第二章 ZAB协议介绍
ZAB ( ZooKeeper Atomic Broadcast , ZooKeeper 原子消息广播协议)是zookeeper数据一致性的核心算法. ZAB 协议并不像 Paxos 算法那样,是一种 ...
- 【BZOJ】【1520】【POI2006】Szk-Schools
网络流/费用流 比较裸的一道题 依旧是二分图模型,由源点S连向每个学校 i (1,0),「注意是连向第 i 所学校,不是连向学校的标号m[i]……唉这里WA了一次」 然后对于每所学校 i 连接 j+n ...
随机推荐
- javascript-原生-闭包
1.变量的作用域 前提:这里只全部都通过var创建的变量或对象 1.全局变量:函数外创建变量 var x=10; function test(){ alert("全局变量在test函数中&q ...
- MySQL:提高笔记-3
MySQL:提高笔记-3 学完基础的语法后,进一步对 MySQL 进行学习,前几篇为: MySQL:提高笔记-1 MySQL:提高笔记-2 MySQL:提高笔记-3,本文 说明:这是根据 bilibi ...
- BUAA 2020 软件工程 个人项目作业
BUAA 2020 软件工程 个人项目作业 Author: 17373051 郭骏 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 个人项目作业 ...
- OO第三次博客作业--第三单元总结
一.JML 语言的理论基础及应用工具链 JML 是一种行为接口规格语言,提供了对方法和类型的规格定义手段.通过 JML 和其支持工具,不仅可以基于规格自动构造测试用例,并整合了 SMT Solver ...
- Prometheus的单机部署
Prometheus的单机部署 一.什么是Prometheus 二.Prometheus的特性 三.支持的指标类型 1.Counter 计数器 2.Gauge 仪表盘 3.Histogram 直方图 ...
- csp总结 (差点爆零的总结)
T1,iterator忘了怎么写了,想了很久都想不出来有什么可以替代,只好O(n^2): T2,不会,只会打暴力 T3,自以为是正解,写了很久大概3h,却一直过不了大样例,大样例输出全是0: T4,不 ...
- 2021.7.28考试总结[NOIP模拟26]
罕见的又改完了. T1 神炎皇 吸取昨天三个出规律的教训,开场打完T2 20pts直接大力打表1h. 但怎么说呢,我不懂欧拉函数.(其实exgcd都忘了 于是只看出最大平方因子,不得不线性筛,爆拿60 ...
- hdu 5018 Revenge of GCD
题意: 给你两个数:X和Y .输出它们的第K大公约数.若不存在输出 -1 数据范围: 1 <= X, Y, K <= 1 000 000 000 000 思路: 它俩的公约数一定是gcd ...
- IM服务器:开发一个高并发的IM服务器难在哪
IM服务器要实现的最基本功能就是消息的转发.--好像是一句废话! 这就意味着IM服务器要为每个登录用户创建一个与该用户信息相关的内存上下文,为方便描述我们在这里称之为:user_context.use ...
- Piakchu之RCE漏洞
一.Ping(远程系统命令执行) 首先正常输入一个ip,查看页面的返回值.发现有乱码,但是能看出执行了ping命令. 查看源代码,可以看到只是对操作系统进行了判断,而对输入内容是否为ip地址并没有判断 ...