【BZOJ3958】[WF2011]Mummy Madness 二分+扫描线+线段树
【BZOJ3958】[WF2011]Mummy Madness
Description
.jpg)
Input
Output
Sample Input
-3 5
3 4
-6 -2
1 -5
1
0 -1
-1
Sample Output
Case 2: never
HINT
题解:容易想到二分答案mid,因为如果在mid时刻能抓到以后也一直是抓到的。在mid时刻,人可能到达的位置是一个正方形,每个木乃伊能到达的位置也是正方形,我们可以发现如果在mid时刻被抓了,当且仅当木乃伊的移动位置将人的移动位置完全覆盖了。所以我们只需要判断若干个矩形的并是否能覆盖给定矩形即可,用扫描线+线段树可以实现。
但是本人从来没写过矩形并啊,这里学习一发:
考虑标记永久化,我们对于线段树上的每个节点维护cnt:区间中被覆盖的位置个数,sum:当前区间被覆盖了几层。其中cnt相当于值,可以pushup,而sum相当于标记,但不能pushdown。如果一个区间的sum>0,我们令cnt=r-l+1;否则cnt=cnt[lson]+cnt[rson]。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define lson x<<1
#define rson x<<1|1
using namespace std;
const int maxn=100010;
int n,tot;
struct node
{
int l,r,x,k;
node() {}
node(int a,int b,int c,int d) {l=a,r=b,x=c,k=d;}
}p[maxn<<1];
int x[maxn],y[maxn],s1[maxn*80],s[maxn*80];
bool tc[maxn*80];
bool cmp(const node &a,const node &b)
{
return a.x<b.x;
}
void updata(int l,int r,int x,int a,int b,int c)
{
if(l!=r&&tc[x]) tc[lson]=tc[rson]=1,s1[lson]=s1[rson]=s[lson]=s[rson]=tc[x]=0;
if(a<=l&&r<=b)
{
s[x]+=c;
if(s[x]) s1[x]=r-l+1;
else if(l!=r) s1[x]=s1[lson]+s1[rson];
else s1[x]=0;
return ;
}
int mid=(l+r)>>1;
if(a<=mid) updata(l,mid,lson,a,b,c);
if(b>mid) updata(mid+1,r,rson,a,b,c);
if(s[x]) s1[x]=r-l+1;
else if(l!=r) s1[x]=s1[lson]+s1[rson];
else s1[x]=0;
}
inline bool check(int mid)
{
int i;
tot=0;
for(i=1;i<=n;i++)
{
if(x[i]+mid<-mid||x[i]-mid>mid||y[i]+mid<-mid||y[i]-mid>mid) continue;
p[++tot]=node(max(-mid,y[i]-mid),min(mid,y[i]+mid),max(-mid,x[i]-mid),1);
p[++tot]=node(max(-mid,y[i]-mid),min(mid,y[i]+mid),min(mid+1,x[i]+mid+1),-1);
}
sort(p+1,p+tot+1,cmp);
tc[1]=1,s[1]=s1[1]=0;
p[0].x=-mid,p[tot+1]=node(0,0,mid+1,0);
for(i=1;i<=tot+1;i++)
{
if(p[i].x>p[i-1].x&&s1[1]<2*mid+1) return 1;
updata(-mid,mid,1,p[i].l,p[i].r,p[i].k);
}
return 0;
}
inline int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-') f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+(gc^'0'),gc=getchar();
return ret*f;
}
int main()
{
for(int cas=1;;cas++)
{
n=rd();
if(n==-1) return 0;
int i,l=0,r=1000001,mid;
for(i=1;i<=n;i++) x[i]=rd(),y[i]=rd();
while(l<r)
{
mid=(l+r)>>1;
if(check(mid)) l=mid+1;
else r=mid;
}
printf("Case %d: ",cas);
if(l==1000001) printf("never\n");
else printf("%d\n",l);
}
}//4 -3 5 3 4 -6 -2 1 -5 1 0 -1 -1
【BZOJ3958】[WF2011]Mummy Madness 二分+扫描线+线段树的更多相关文章
- 【BZOJ 3958】 3958: [WF2011]Mummy Madness (二分+扫描线、线段树)
3958: [WF2011]Mummy Madness Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 96 Solved: 41 Descripti ...
- 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 ...
- poj1151 Atlantis——扫描线+线段树
题目:http://poj.org/problem?id=1151 经典的扫描线问题: 可以用线段树的每个点代表横向被矩形上下边分割开的每一格,这样将一个矩形的出现或消失化为线段树上的单点修改: 每个 ...
- Codeforces 460C 二分结果+线段树维护
发现最近碰到好多次二分结果的题目,上次多校也是,被我很机智的快速过了,这个思想确实非常不错.在正面求比较难处理的时候,二分结果再判断是否有效往往柳暗花明. 这个题目给定n个数字的序列,可以操作m次,每 ...
随机推荐
- The declared package "com.dao" does not match the expected package "src.com.dao"
今天把项目代码上传到svn后出现例如以下错误:The declared package "com.dao" does not match the expected package ...
- java.lang.UnsatisfiedLinkError: No implementation found for int com.xxx.xx中的couldn’t find “XX.so”或loadLibrary("xxx")失败
我觉得这是个神坑,虽然早几年网上就很多po出来的解决方式,但是同样的问题,我的bug却稳如泰山,一点用都没有,好气 下面总结一下 这里前面先是有个系统打印信息 I/System.out: loadLi ...
- Ubuntu-Python2.7安装 scipy,numpy,matplotlib 和pip
一. scipy,numpy,matplotlib sudo apt-get install python-scipy sudo apt-get install python-numpy sudo a ...
- 15款最好的 jQuery 网格布局插件
如今,大多数网站设计要靠网格系统和布局,这能够提供给设计人员一个方便的途径来组织网页上的内容.网格的设计最常见于报纸和杂志的版面,由文字和图像构成的列组成. 这篇文章给大家分享精心挑选的15款最佳的 ...
- WCF(一)
摘自:http://www.cnblogs.com/yank/p/3653160.html WCF入门教程(一)简介 1.WCF是什么? WCF( Windows Communication Foun ...
- 使用rcp命令实现从远程机器拷贝文件
rcp:远程文件复制 使用rcp命令可以在远程主机之间复制文件,如果同时指定2个以上的文件或目录,且最后的目的地是一个已经存在的目录,则他会把前面指定的所有文件或目录复制到该目录中. rcp命令语法: ...
- 机器学习性能评估指标(精确率、召回率、ROC、AUC)
http://blog.csdn.net/u012089317/article/details/52156514 ,y^)=1nsamples∑i=1nsamples(yi−y^i)2
- Struts2学习笔记(OGNL表达式)
Struts 2支持以下几种表达式语言: OGNL(Object-Graph Navigation Language),可以方便地操作对象属性的开源表达式语言: JSTL(JSP Standard T ...
- C++中 char *s 和 char s[] 的区别
原因 刚好看到给main传递参数,书上(C++Primer)说“ int main(int argc, char *argv[])也可以写成 int main(int argc, char **arg ...
- Runtime是什么?
在看 RPC 的概念模型与实现解析 的时候,看到图片上有Runtime,又想到见过很多Runtime之类的东西,所以就想弄明白这到底是个什么东西. (因为是程序名,所以根本没想到代码的“编译-运行”~ ...