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

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

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

标题效果:特定n点。涵盖所有的点与同方三面。斧头要求方垂直边界,最小平方的需求方长值

最大值至少。答案是很明显的二分法

但验证是一个问题

考虑仅仅有三个正方形,故用一个最小矩形覆盖这三个正方形时至少有一个在角上 若有四个正方形该结论不成立

于是我们採用DFS的方式 每次用一个最小的矩形覆盖全部的点,枚举矩形的四个角 将正方形填进去

因为最大深度是3,所以时间上全然能够承受

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define M 20100
using namespace std;
struct abcd{
	int x,y;
}points[M];
int n,v[M];
int stack[M],top;
bool DFS(int L,int dpt)
{
	int i,j,bottom=top;
	int minx=0x3f3f3f3f,maxx=0xefefefef;
	int miny=0x3f3f3f3f,maxy=0xefefefef;
	if(top==n)
		return true;
	if(dpt==3)
		return false;
	for(i=1;i<=n;i++)
		if(!v[i])
		{
			minx=min(minx,points[i].x);
			maxx=max(maxx,points[i].x);
			miny=min(miny,points[i].y);
			maxy=max(maxy,points[i].y);
		}
	int dx[]={minx,minx,maxx-L,maxx-L};
	int dy[]={miny,maxy-L,miny,maxy-L};
	for(j=0;j<4;j++)
	{
		for(i=1;i<=n;i++)
			if(!v[i])
				if(points[i].x>=dx[j]&&points[i].x<=dx[j]+L)
					if(points[i].y>=dy[j]&&points[i].y<=dy[j]+L)
						v[i]=1,stack[++top]=i;
		bool flag=DFS(L,dpt+1);
		while(top!=bottom)
			v[stack[top--]]=0;
		if(flag)
			return true;
	}
	return false;
}
int Bisection()
{
	int l=0,r=0x3f3f3f3f;
	while(l+1<r)
	{
		int mid=l+r>>1;
		if( DFS(mid,0) )
			r=mid;
		else
			l=mid;
	}
	if( DFS(l,0) )
		return l;
	return r;
}
int main()
{
	int i;
	cin>>n;
	for(i=1;i<=n;i++)
		scanf("%d%d",&points[i].x,&points[i].y);
	cout<<Bisection()<<endl;
}

版权声明:本文博客原创文章,博客,未经同意,不得转载。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/117596.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 验证码的作用及原理

    验证码的作用及原理验证码的发展历程从互联网诞生前期,互联网是没有验证码的。在论坛博客上发帖子,只要敲一下回车键按“发表”就可以了。然而,有白客就有黑客,随着计算机程序的愈发发展,黑客十分猖狂。他们编写了一种能够大量、重复编写信息的程序,伪装成人类用户,肆无忌惮的在网络上倾倒大量的、无意义的“僵尸”信息,垃圾邮件、垃圾广告、垃圾评论到处飞。更编写了模仿登录、恶意激活成功教程代码、刷票等恶意程序。这严重影响了互联网的正常运行,导致体验效果很差。以受影响最大的电子邮件的提供商为例:用户每天收到数以千计的垃圾邮件,严重影响工作效率。.

    2022年7月14日
    18
  • linux杀掉mysql进程_linux杀死pid进程

    linux杀掉mysql进程_linux杀死pid进程使用“ps-e|grepmysql”命令,查看mysql程序的对应的pid号。使用“kill-9进程号”命令,可以结束掉mysqld_safe进程。使用”killallmysqld”命令,可以杀掉所有已mysqld命名的进程。…

    2022年9月1日
    4
  • MySQL的锁机制_线程安全与锁机制

    MySQL的锁机制_线程安全与锁机制一、锁的作用数据库使用锁是为了支持对共享资源的并发访问,同时保证数据的完整性和一致性。二、锁的类型2.1全局锁全局锁意味着对整个数据库实例加上锁。通常使用的是全局读锁——Flushtableswithreadlock(FTWRL)。使用这个命令,可以使整个库处于只读状态,其他线程的无论使用DML、DDL甚至是事务的提交语句都会无法正常执行。使用场景做全库逻辑备份,对所有的表数据进行锁定,保证数据的一致性。问题但是FTWRL的全局锁方案有比较严重的缺

    2022年9月30日
    3
  • CorelDraw技術討論區

    CorelDraw技術討論區CorelDraw製作討論專區子區:技術討論區

    2022年6月24日
    26
  • Hmily(1)

    Hmily(1)1. Hmily是个高性能异步分布式事务TCC框架,具体包含SpringAOP,Disruptor,Dubbo等框架,当然还有其他的RPC框架。源码在https://github.com/yu199195/hmily,本文以duubo调用,mysql存储事务日志,kryo序列化为主,主要以下单支付减库存减余额为例,注解为Hmily,确认方法,取消方法和本次的tyr操作方法参数应该保持一致。前两个…

    2022年5月22日
    40

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号