Problem

BZOJ

Solution

算法:二分+扫描线

快要2019年了,就瞎写一篇博客来凑数,不然感觉太荒凉了……

答案是可二分的,那么二分的依据是什么呢?不妨设当前二分的答案为\(mid\),那么考虑自己和木乃伊在\(mid\)的时间内能够到达的所有格子,组成了一个正方形,如果自己的正方形被木乃伊的正方形完全覆盖住了,则自己无处可逃。

那难道就没有可能自己在中途被木乃伊抓住吗?不妨考虑逆推。

首先我们可以认同的是如果一个格子在\(mid\)时安全,那么它的八联通格子在\(mid-1\)的时间都安全。那么在\(mid\)时对于某个安全格子,它的八联通格子在\(mid-1\)时都是可以落脚的,而且这个格子还要能在\(mid-1\)时到达,这个格子必然存在。那么我们通过不断逆推,即可找到走过来的安全路径。

时间复杂度\(O(n\log^2 n)\)

关于细节实现上要多做一点优化,免得TLE。

Code

#include <algorithm>
#include <cstdio>
#define pushup(rt) sum[rt]=(cnt[rt]?(r-l+1):(sum[rt<<1]+sum[rt<<1|1]))
using namespace std;
typedef long long ll;
const int maxn=4000010;
template <typename Tp> inline int getmin(Tp &x,Tp y){return y<x?x=y,1:0;}
template <typename Tp> inline int getmax(Tp &x,Tp y){return y>x?x=y,1:0;}
template <typename Tp> inline void read(Tp &x)
{
x=0;int f=0;char ch=getchar();
while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
if(ch=='-') f=1,ch=getchar();
while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
if(f) x=-x;
}
struct vec{
int x,y;
bool operator < (const vec &b)const{return x<b.x;}
}p[maxn];
int z,n,m,MX,sum[maxn<<2],cnt[maxn<<2];
int abs(int x){return x<0?-x:x;}
void update(int l,int r,int L,int R,int val,int rt)
{
if(L<=l&&r<=R){cnt[rt]+=val;pushup(rt);return ;}
int m=(l+r)>>1;
if(L<=m) update(l,m,L,R,val,rt<<1);
if(m<R) update(m+1,r,L,R,val,rt<<1|1);
pushup(rt);
}
int query(int l,int r,int L,int R,int rt)
{
if(cnt[rt]) return min(R,r)-max(L,l)+1;
if(L<=l&&r<=R) return sum[rt];
int m=(l+r)>>1,res=0;
if(L<=m) res+=query(l,m,L,R,rt<<1);
if(m<R) res+=query(m+1,r,L,R,rt<<1|1);
return res;
}
int cross(int id,int dis)
{
if(p[id].y-dis>dis||p[id].y+dis<-dis) return 0;
return 1;
}
int check(int x)
{
int s=1,t,res=0,lst=0;
while(p[s].x+x<-x) s++;t=s;
for(int i=-x;i<=x;i++)
{
while(s<=n&&p[s].x-x<=i)
{
if(cross(s,x))
{
lst=-1;
update(-MX,MX,p[s].y-x,p[s].y+x,1,1);
}
++s;
}
while(t<=n&&p[t].x+x<i)
{
if(cross(t,x))
{
lst=-1;
update(-MX,MX,p[t].y-x,p[t].y+x,-1,1);
}
++t;
}
if(~lst) continue;
lst=query(-MX,MX,-x,x,1);
if(lst<(x<<1|1)){res=1;break;}
}
while(t<s)
{
if(cross(t,x)) update(-MX,MX,p[t].y-x,p[t].y+x,-1,1);
++t;
}
return res;
}
int input()
{
read(n);
if(n==-1) return 0;
int res=0;MX=0;
for(int i=1;i<=n;i++)
{
read(p[i].x);read(p[i].y);
getmax(MX,abs(p[i].y));
getmax(res,abs(p[i].x));
}
getmax(res,MX);MX+=res;
sort(p+1,p+n+1);
return res;
}
int main()
{
int L,R,mid,ans;
while((R=input())||(~n))
{
L=1;ans=-1;
while(L<=R)
{
mid=(L+R)>>1;
if(!check(mid)) R=mid-1,ans=mid;
else L=mid+1;
}
if(~ans) printf("Case %d: %d\n",++z,ans);
else printf("Case %d: never\n",++z);
}
return 0;
}

BZOJ 3958 Mummy Madness的更多相关文章

  1. 【BZOJ 3958】 3958: [WF2011]Mummy Madness (二分+扫描线、线段树)

    3958: [WF2011]Mummy Madness Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 96  Solved: 41 Descripti ...

  2. 【BZOJ3958】[WF2011]Mummy Madness 二分+扫描线+线段树

    [BZOJ3958][WF2011]Mummy Madness Description 在2011年ACM-ICPC World Finals上的一次游览中,你碰到了一个埃及古墓. 不幸的是,你打开了 ...

  3. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  4. WorldFinal11 (2/11)

    WorldFinal 11 Trash Removal 题意 给你一个多边形,问这个多边形至少需要多宽的长度,才能把这个多边形放进去. 数据范围100 题解 数据范围只有100,暴力枚举两点,然后算最 ...

  5. BZOJ 2127: happiness [最小割]

    2127: happiness Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 1815  Solved: 878[Submit][Status][Di ...

  6. BZOJ 3275: Number

    3275: Number Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 874  Solved: 371[Submit][Status][Discus ...

  7. BZOJ 2879: [Noi2012]美食节

    2879: [Noi2012]美食节 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1834  Solved: 969[Submit][Status] ...

  8. bzoj 4610 Ceiling Functi

    bzoj 4610 Ceiling Functi Description bzoj上的描述有问题 给出\(n\)个长度为\(k\)的数列,将每个数列构成一个二叉搜索树,问有多少颗形态不同的树. Inp ...

  9. BZOJ 题目整理

    bzoj 500题纪念 总结一发题目吧,挑几道题整理一下,(方便拖板子) 1039:每条线段与前一条线段之间的长度的比例和夹角不会因平移.旋转.放缩而改变,所以将每条轨迹改为比例和夹角的序列,复制一份 ...

随机推荐

  1. bzoj3622-已经没有什么好害怕的的了

    题意 给出两个长度为 \(n\) 的数列 \(a,b\) ,\(2n\) 个数都互不相同,求有多少种对应方式使得 \(a_i>b_i\) 的个数比 \(a_i<b_i\) 的个数恰好多 \ ...

  2. bzoj3517 翻硬币

    题意 有一个n行n列的棋盘,每个格子上都有一个硬币,且n为偶数.每个硬币要么是正面朝上,要么是反面朝上.每次操作你可以选定一个格子(x,y),然后将第x行和第y列的所有硬币都翻面.求将所有硬币都变成同 ...

  3. 题解 P2955 【[USACO09OCT]奇数偶数Even? Odd? 】

    很明显这题是个假入门! 小金羊一不小心点进题解发现了内幕 能看的出来都WA过Unsigned long long int 做题可以用Python,Python的变量虽然 强悍的不行! 但是我们可以用字 ...

  4. eclipse启动报错: No Java virtual machine

    在 scala-ide下载集成scala包的eclipse版本使用,启动时报错: A java runtime environment (JRE) or java development kit (J ...

  5. Seek the Name, Seek the Fame POJ - 2752(拓展kmp || kmp)

    题意: 就是求前缀和后缀相同的那个子串的长度  然后从小到大输出 解析: emm...网上都用kmp...我..用拓展kmp做的  这就是拓展kmp板题嘛... 求出extend数组后  把exten ...

  6. 相机标定 和 单应性矩阵H

    求解相机参数的过程就称之为相机标定. 1.相机模型中的四个平面坐标系: 1.1图像像素坐标系(u,v) 以像素为单位,是以图像的左上方为原点的图像坐标系: 1.2图像物理坐标系(也叫像平面坐标系)(x ...

  7. UESTC--1682

    原题链接: 分析:求最小周期的应用. #include<cstdio> #include<cstring> #include<cmath> #include< ...

  8. array_intersect、array_intersect_key、array_intersect_assoc、array_intersect_ukey、array_intersect_uassoc 的用法

    <?php // array_intersect 的用法是返回一个关联数组(键是第一个参数数组的键), // 该数组包含了所有在 $array1 中同时也出现在其他参数数组中的值 // 下面的 ...

  9. Rabbitmq--topic

    一.前言 前面讲到direct类型的Exchange路由规则是完全匹配binding key与routing key,但这种严格的匹配方式在很多情况下不能满足实际业务需求.topic类型的Exchan ...

  10. 「PLC」PLC基本编程

    PLC中无非就是三大量:开关量(数字量).模拟量.脉冲量.只在搞清楚三者之间的关系,你就能熟练的掌握PLC了. PLC编程算法(一) 1. 开关量也称逻辑量,指仅有两个取值,0或1.ON或OFF.它是 ...