【BZOJ 3958】 3958: [WF2011]Mummy Madness (二分+扫描线、线段树)
3958: [WF2011]Mummy Madness
Time Limit: 10 Sec Memory Limit: 256 MB
Submit: 96 Solved: 41Description
在2011年ACM-ICPC World Finals上的一次游览中,你碰到了一个埃及古墓。不幸的是,你打开了坟墓之后,才发现这是一个坏主意:突然之间,原本空无一物的沙漠上已经爬满了暴躁的木乃伊。(如果你也沉睡几千年而突然被惊醒,你也会变得如此暴躁的。)(幸运的是,当你做完这道题的时候,你醒来了,发现你在弗罗里达的酒店里。那些木乃伊只是一场梦。)面对这一大堆疯狂的木乃伊,你唯一的机会就是试图在他们抓到你之前逃跑。问题是:假如你与木乃伊永不疲倦,那么经过多长时间你会被木乃伊抓到?我们把沙漠看成一个正方形的网格,你与木乃伊轮流移动(你走出第一步)。轮到你时,你可以移动到相邻的8个格子之一,或者站着不动。轮到木乃伊时,每个木乃伊会移动到其相邻的格子之一,使得他与你的欧几里得距离尽量小(假设你与木乃伊都站在格子的中心位置)。允许多个木乃伊同时占据同一个格子。在每个单位时间内,你先做出移动,然后木乃伊做出移动。如果你与任何一个木乃伊站在同一位置,你会被抓住。当然,你试图尽量长时间避免被抓住。经过多少单位时间你会被抓住呢?下图描述了你被4个木乃伊追逐的例子。H代表你的初始位置,而M代表木乃伊的初始位置。以你的初始位置为原点,则经过4个单位时间后,你被初始位置为(3,4)的木乃伊抓住。Input
输入文件包含若干组数据。每组数据的第一行为一个数n(0≤n≤10^5),表示沙漠中木乃伊的个数。接下来n行,每行两个整数x y,表示初始时在(x,y)有一个木乃伊。x,y的绝对值均不超过10^6。你的初始位置是(0,0),保证一开始这里没有木乃伊。输入文件以一行-1结束。Output
对于每组测试数据,输出一行,包括它的编号和被抓住经过的最长时间(即你做出决策的次数);或输出"never",如果你有办法永远不被抓住。请以样例输出的格式输出数据。Sample Input
4
-3 5
3 4
-6 -2
1 -5
1
0 -1
-1Sample Output
Case 1: 4
Case 2: neverHINT
对于100%的数据,n≤10^5Source
【分析】
我不会做。。膜奥爷爷。。
二分【显然可以】走多少步,然后把人和木乃伊能走的范围【是矩形】画出来,然后如果木乃伊们能走的范围完全覆盖了人能走的范围,那么就会被赶尽杀绝了!!
然后就线段树做扫描线。。具体看之前的博客:http://www.cnblogs.com/Konjakmoyu/p/6050343.html
wohenshuai说得对,不要随便离散化【但是我还是离散化了】,不然很容易错。。
然后,只做询问的区间,不然很容易T【我已经T了3、4遍了,卡评测】
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define Maxn 100010 int mymin(int x,int y) {return x<y?x:y;}
int mymax(int x,int y) {return x>y?x:y;} struct node{int x,y;}t[Maxn];
struct hp{int l,r,h,f;}w[Maxn*];
struct lsh{int x,id;}ls[Maxn*];
bool cmp(lsh x,lsh y) {return x.x<y.x;}
bool cmp2(hp x,hp y) {return (x.h==y.h)?(x.f>y.f):(x.h<y.h);}
int n; struct nnode
{
int l,r,lc,rc,cnt;
bool p;
}tr[Maxn*]; int tot;
int build(int l,int r)
{
int x=++tot;
tr[x].l=l;tr[x].r=r;
tr[x].cnt=;tr[x].p=;
if(l!=r)
{
int mid=(l+r)>>;
tr[x].lc=build(l,mid);
tr[x].rc=build(mid+,r);
}
else tr[x].lc=tr[x].rc=;
return x;
} void upd(int x)
{
if(tr[tr[x].lc].p&&tr[tr[x].rc].p) tr[x].p=;
else if(tr[x].cnt>) tr[x].p=;
else tr[x].p=;
} void change(int x,int l,int r,int y)
{
if(tr[x].l==l&&tr[x].r==r)
{
tr[x].cnt+=y;
upd(x);
return;
}
int mid=(tr[x].l+tr[x].r)>>;
if(r<=mid) change(tr[x].lc,l,r,y);
else if(l>mid) change(tr[x].rc,l,r,y);
else
{
change(tr[x].lc,l,mid,y);
change(tr[x].rc,mid+,r,y);
}
upd(x);
} int query(int x,int l,int r)
{
if(tr[x].p) return ;
if(tr[x].l==l&&tr[x].r==r) return tr[x].p;
int mid=(tr[x].l+tr[x].r)>>;
if(r<=mid) return query(tr[x].lc,l,r);
else if(l>mid) return query(tr[x].rc,l,r);
else return (query(tr[x].lc,l,mid)&&query(tr[x].rc,mid+,r));
} bool check(int nw)
{
w[].l=-nw;w[].r=nw;w[].h=-nw;w[].f=-;
w[].l=-nw;w[].r=nw;w[].h=nw;w[].f=-;
int wl=;
for(int i=;i<=n;i++)
{
if(t[i].y+nw<-nw||t[i].y-nw>nw) continue;
if(t[i].x+nw<-nw||t[i].x-nw>nw) continue;
w[++wl].l=mymax(-nw,t[i].x-nw);w[wl].r=mymin(t[i].x+nw,nw);w[wl].h=t[i].y-nw;w[wl].f=;
if(t[i].y+nw<=nw) {w[++wl].l=mymax(t[i].x-nw,-nw);w[wl].r=mymin(t[i].x+nw,nw);w[wl].h=t[i].y+nw+;w[wl].f=-;}
}
int sl=;
for(int i=;i<=wl;i++) {ls[++sl].x=w[i].l,ls[sl].id=i;ls[++sl].x=w[i].r;ls[sl].id=-i;}
sort(ls+,ls+sl+,cmp);
int p=;
if(ls[].id>) w[ls[].id].l=;
else w[-ls[].id].r=;
for(int i=;i<=sl;i++)
{
if(ls[i].x!=ls[i-].x)
{
// p++;
if(ls[i].x-ls[i-].x==) p++;
else p+=;
}
if(ls[i].id>) w[ls[i].id].l=p;
else w[-ls[i].id].r=p;
}
sort(w+,w++wl,cmp2);
tot=;
build(,p);
bool ok=;
int asl=-,asr;
for(int i=;i<=wl;i++)
{
if(w[i].f==-) asl=w[i].l,asr=w[i].r;
if(w[i].f!=-&&w[i].f!=-) change(,w[i].l,w[i].r,w[i].f);
if(asl!=-&&!tr[].p) {ok=;break;}
if(w[i].f==-) break;
}
return ok;
} void ffind(int l,int r)
{
int ans=-;
while(l<=r)
{
int mid=(l+r)>>;
if(check(mid)) ans=mid,r=mid-;
else l=mid+;
}
if(ans==-) printf("never\n");
else printf("%d\n",ans);
} int main()
{
int kase=;
while()
{
scanf("%d",&n);
if(n==-) break;
for(int i=;i<=n;i++) scanf("%d%d",&t[i].x,&t[i].y);
printf("Case %d: ",++kase);
ffind(,);
}
return ;
}
2017-03-28 19:21:43
【BZOJ 3958】 3958: [WF2011]Mummy Madness (二分+扫描线、线段树)的更多相关文章
- 【BZOJ3958】[WF2011]Mummy Madness 二分+扫描线+线段树
[BZOJ3958][WF2011]Mummy Madness Description 在2011年ACM-ICPC World Finals上的一次游览中,你碰到了一个埃及古墓. 不幸的是,你打开了 ...
- BZOJ 3022 [Balkan2012]The Best Teams(扫描线+线段树)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3022 [题目大意] 给定n个球员,第i个球员年龄为AGEi,水平为SKILLi. 没有 ...
- BZOJ.3307.雨天的尾巴(dsu on tree/线段树合并)
BZOJ 洛谷 \(dsu\ on\ tree\).(线段树合并的做法也挺显然不写了) 如果没写过\(dsu\)可以看这里. 对修改操作做一下差分放到对应点上,就成了求每个点子树内出现次数最多的颜色, ...
- HDU 3642 - Get The Treasury - [加强版扫描线+线段树]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3642 Time Limit: 10000/5000 MS (Java/Others) Memory L ...
- [BZOJ4552][TJOI2016&&HEOI2016]排序(二分答案+线段树/线段树分裂与合并)
解法一:二分答案+线段树 首先我们知道,对于一个01序列排序,用线段树维护的话可以做到单次排序复杂度仅为log级别. 这道题只有一个询问,所以离线没有意义,而一个询问让我们很自然的想到二分答案.先二分 ...
- HDU 3265/POJ 3832 Posters(扫描线+线段树)(2009 Asia Ningbo Regional)
Description Ted has a new house with a huge window. In this big summer, Ted decides to decorate the ...
- 【bzoj4491】我也不知道题目名字是什么 离线扫描线+线段树
题目描述 给定一个序列A[i],每次询问l,r,求[l,r]内最长子串,使得该子串为不上升子串或不下降子串 输入 第一行n,表示A数组有多少元素接下来一行为n个整数A[i]接下来一个整数Q,表示询问数 ...
- hdu1542 Atlantis(扫描线+线段树+离散)矩形相交面积
题目链接:点击打开链接 题目描写叙述:给定一些矩形,求这些矩形的总面积.假设有重叠.仅仅算一次 解题思路:扫描线+线段树+离散(代码从上往下扫描) 代码: #include<cstdio> ...
- P3722 [AH2017/HNOI2017]影魔(单调栈+扫描线+线段树)
题面传送门 首先我们把这两个贡献翻译成人话: 区间 \([l,r]\) 产生 \(p_1\) 的贡献当且仅当 \(a_l,a_r\) 分别为区间 \([l,r]\) 的最大值和次大值. 区间 \([l ...
随机推荐
- 应用于网站导航中的 12 个 jQuery 插件
当考虑到网页设计时,导航被认为是使网页以用户友好方式展现的一个重要部分.在现代的交互网站中,导航起着至关重要的作用,如果没有正确地处理会影响你网站的访问.适当的导航工具能够帮助用户在网站的不同页面内容 ...
- Stat3—因子分析(Factor Analysis)
题注:主成分分析分析与因子分析也有不同,主成分分析仅仅是变量变换,而因子分析需要构造因子模型.主成分分析:原始变量的线性组合表示新的综合变量,即主成分:因子分析:潜在的假想变量和随机影响变量的线性组合 ...
- 【BZOJ】4753: [Jsoi2016]最佳团体 01分数规划+树上背包
[题意]n个人,每个人有价值ai和代价bi和一个依赖对象ri<i,选择 i 时 ri 也必须选择(ri=0时不依赖),求选择k个人使得Σai/Σbi最大.n<=2500,ai,bi< ...
- python学习笔记(十一)之序列
之前学习的列表,元组,字符串都是序列类型,有很多共同特点: 通过索引得到每一个元素,索引从0开始 通过分片的方法得到一个范围的元素的集合 很多通用的操作符(重复操作符,拼接操作符,成员关系操作符) 序 ...
- 2017ACM暑期多校联合训练 - Team 2 1009 HDU 60563 TrickGCD (容斥公式)
题目链接 Problem Description You are given an array A , and Zhu wants to know there are how many differe ...
- 20、什么样的项目适合Web自动化测试
1.什么是Web自动化测试?概念:让程序代替人为自动验证Web项目功能的过程 2.什么Web项目适合做自动化测试 1.需求变动不频繁 2.项目周期长 3.项目需要回归测试 3.如阿进行Web自动化测试 ...
- 打表找规律C - Insertion Sort Gym - 101955C
题目链接:https://cn.vjudge.net/contest/273377#problem/C 给你 n,m,k. 这个题的意思是给你n个数,在对前m项的基础上排序的情况下,问你满足递增子序列 ...
- Sqlmap注入技巧收集整理
TIP1 当我们注射的时候,判断注入 http://site/script?id=10http://site/script?id=11-1 # 相当于 id=10http://site/script? ...
- android Timer TimerTask用法笔记
Android中经常会遇到执行一些周期性定时执行的任务.初学的时候经常会使用Thread.sleep()方法.在android中,有Timer可以专门干这个事情. 先看看Timer.class中都是些 ...
- 【zTree】zTree展开树节点
今天在做zTree树的时候想着将第一级tree展开,于是利用下面方法: /** * 展开树节点的第一层 */ function openFirstTreenode(){ // 获取树对象 var tr ...