【BZOJ1052】【HAOI2007】覆盖问题 二分+深搜check

题解:乱搞。

就是搜每个正方形的位置(一定在一个角,证明自己想想吧,很容易但是不算太好写)

代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 20100
#define inf 0x3f3f3f3f
using namespace std;

struct Point
{
	int x,y;
	Point(int _x=0,int _y=0):x(_x),y(_y){}
	bool ins(int xl,int xr,int yl,int yr)
	{
		if(x<xl||xr<x)return 0;
		if(y<yl||yr<y)return 0;
		return 1;
	}
}P[N];
int vis[N];
int n;

bool check(int mid,int dep,int xl,int xr,int yl,int yr) // 当前矩形
{
	if(xl>xr)return 1;
	if(dep>3)return 0;

	int i,j,k;
	int ra[4],rb[4],rc[4],rd[4]; // 这个东西我竟然傻叉到开了全局……  sad story
	ra[0]=ra[1]=xl,rb[0]=rb[1]=xl+mid;
	ra[2]=ra[3]=xr-mid,rb[2]=rb[3]=xr;
	rc[0]=rc[2]=yl,rd[0]=rd[2]=yl+mid;
	rc[1]=rc[3]=yr-mid,rd[1]=rd[3]=yr;

	for(j=0;j<4;j++)
	{
		int sxl=ra[j],sxr=rb[j],syl=rc[j],syr=rd[j]; // 当前正方形
		int nxl=inf,nxr=-inf,nyl=inf,nyr=-inf; // 新矩形
		for(i=1;i<=n;i++)if(!vis[i])
		{
			if(P[i].ins(sxl,sxr,syl,syr))vis[i]=dep;
			else {
				nxl=min(nxl,P[i].x),nxr=max(nxr,P[i].x);
				nyl=min(nyl,P[i].y),nyr=max(nyr,P[i].y);
			}
		}
		if(check(mid,dep+1,nxl,nxr,nyl,nyr))return 1;
		for(i=1;i<=n;i++)if(vis[i]==dep)vis[i]=0;
	}
	return 0;
}
int main()
{
//	freopen("test.in","r",stdin);
	int i,j,k;
	int x,y;
	scanf("%d",&n);
	int xl=inf,xr=-inf,yl=inf,yr=-inf;
	for(i=1;i<=n;i++)
	{
		scanf("%d%d",&x,&y);
		xl=min(xl,x),xr=max(xr,x);
		yl=min(yl,y),yr=max(yr,y);
		P[i]=Point(x,y);
	}
	int l=0,r=max(xr-xl,yr-yl),mid,ans;
	while(l<r)
	{
		if(r-l<3)
		{
			ans=inf;
			for(i=r;i>=l;i--)
			{
				memset(vis,0,sizeof(vis));
				if(check(i,1,xl,xr,yl,yr))ans=i;
			}
			break;
		}
		int mid=l+r>>1;
		memset(vis,0,sizeof(vis));
		if(check(mid,1,xl,xr,yl,yr))r=mid;
		else l=mid;
	}
	printf("%d\n",ans);
	return 0;
}
时间: 2024-10-19 14:53:47

【BZOJ1052】【HAOI2007】覆盖问题 二分+深搜check的相关文章

bzoj1052: [HAOI2007]覆盖问题(二分+构造)

貌似又写出了常数挺优(至少不劣)的代码>v< 930+人AC #49 写了个O(nlogn)貌似比一些人O(n)还快2333333 这题还是先二分答案,check比较麻烦 显然正方形一定以最左上或最右上或最左下或最右下的点为端点来盖,盖了一个之后再拿一个枚举剩下的点作为四个端点来盖,最后一个直接判断剩下的点能不能一次性盖就好了 #include<iostream> #include<cstring> #include<cstdlib> #include<

BZOJ 1052 HAOI2007 覆盖问题 二分答案+DFS

题目大意:给定n个点,用三个边长相同的正方形覆盖所有点,要求正方形边界与坐标轴垂直,求正方形边长的最小值 最大值最小,很明显二分答案 但是验证是个问题 考虑只有三个正方形,故用一个最小矩形覆盖这三个正方形时至少有一个在角上 若有四个正方形该结论不成立 于是我们采用DFS的方式 每次用一个最小的矩形覆盖所有的点,枚举矩形的四个角 将正方形填进去 由于最大深度是3,所以时间上完全可以承受 #include<cstdio> #include<cstring> #include<io

BZOJ1052[HAOI2007]覆盖问题

Description 某人在山上种了N棵小树苗.冬天来了,温度急速下降,小树苗脆弱得不堪一击,于是树主人想用一些塑料薄 膜把这些小树遮盖起来,经过一番长久的思考,他决定用3个L*L的正方形塑料薄膜将小树遮起来.我们不妨将山建 立一个平面直角坐标系,设第i棵小树的坐标为(Xi,Yi),3个L*L的正方形的边要求平行与坐标轴,一个点如果在 正方形的边界上,也算作被覆盖.当然,我们希望塑料薄膜面积越小越好,即求L最小值. Input 第一行有一个正整数N,表示有多少棵树.接下来有N行,第i+1行有2

「二分答案 + 搜索」[HAOI2007]覆盖问题

[HAOI2007]覆盖问题 题目链接:[HAOI2007]覆盖问题 题目大意 给你\(n\)个坐标,再给你3个\(l \times l\)的矩阵,让你用这些矩阵去包含这些点,要求是将所有点都包含,我们要求\(l\)的最小值 题目题解 想到二分了,不过没想到怎么爆搜 看了下题解,妙啊妙啊,牛逼 每次二分一个 \(l\) 值作为我们想要的矩阵边长,然后由树的坐标我们可能可以找到比原平面直角坐标系更小的一个坐标系,我们在新的坐标系上进行操作就可以了,但怎么进行操作呢?我们如果想尽可能的缩小新坐标系的

POJ 1129-Channel Allocation(四色定理+迭代深搜)

题目链接:传送门 题意:n个信号站,给出连接情况,要用信号覆盖所有信号站,要求相连的信号站不能用同一个信号. 等价问题==无向图染色==四色定理(每个平面地图都可以只用四种颜色来染色,而且没有两个邻接的区域颜色相同.已证明) 思路:深搜一条路(枚举颜色,判断当前点用已有的颜色能不能染,如不能则加一种颜色,判断强判就行了),搜到头答案就出来了..然后返回就可以了 注意单复数.. #include <algorithm> #include <iostream> #include <

水叮当的舞步 深搜

背景 Background 水叮当得到了一块五颜六色的格子形地毯作为生日礼物,更加特别的是,地毯上格子的颜色还能随着踩踏而改变. 为了讨好她的偶像虹猫,水叮当决定在地毯上跳一支轻盈的舞来卖萌~~~ 描述 Description 地毯上的格子有N行N列,每个格子用一个0~5之间的数字代表它的颜色. 水叮当可以随意选择一个0~5之间的颜色,然后轻轻地跳动一步,左上角的格子所在的联通块里的所有格子就会变成她选择的那种颜色.这里连通定义为:两个格子有公共边,并且颜色相同. 由于水叮当是施展轻功来跳舞的,

深搜整理汇总

2801 LOL-盖伦的蹲草计划 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 题目描述 Description 众所周知,LOL这款伟大的游戏,有个叫盖伦的英雄.他的伟大之处在于他特别喜欢蹲草丛阴人(XL:蹲草阴人也算英雄?!CZQ:没办法,个个都是这么玩的).某日,德玛西亚与诺克萨斯之间又发生了一场战斗,嘉文四世希望盖伦能带领一支K人的德玛西亚军队出战. 战斗发生在召唤师峡谷.整个召唤师峡谷被分割成M行N列的一个矩阵,矩阵中有空地和几片草丛.这几片草丛中有

(暴力+深搜)POJ - 2718 Smallest Difference

原题链接: http://poj.org/problem?id=2718 题意: 给你几个数字,可以分成两个子集,然后分别按一定顺序排列组成一个数,求出这两只值差的绝对值的最小值. 分析: 反正也是刷着玩,果断先交一波全排列枚举的代码,果断TLE,然后开始想正解. 稍微想想,既然要差最小,肯定是两个数各一半.所以只要深搜出所有n/2(n为给定数字的个数)的组合,另外个n-n/2个数就有了. 但是枚举出来后的操作又想了很久,想过很多算法,都不怎么满意,最终用二分解决. 先把n/2和n-n/2全排列

【BZOJ 1052】 [HAOI2007]覆盖问题

1052: [HAOI2007]覆盖问题 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 1095  Solved: 500 [Submit][Status] Description 某人在山上种了N棵小树苗.冬天来了,温度急速下降,小树苗脆弱得不堪一击,于是树主人想用一些塑料薄膜把这些小树遮盖起来,经过一番长久的思考,他决定用3个L*L的正方形塑料薄膜将小树遮起来.我们不妨将山建立一个平面直角坐标系,设第i棵小树的坐标为(Xi,Yi),3个L*