AC日记——[HAOI2007]覆盖问题 bzoj 1052
思路:
二分答案;
二分可能的长度;
然后递归判断长度是否可行;
先求出刚好覆盖所有点的矩形;
可行的第一个正方形在矩形的一个角上;
枚举四个角上的正方形,然后删去点;
删去一个正方形后,递归求出删去一个正方形后的矩形;
往复三次,判断三次删点能否全部删光;
代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; #define maxn 20005
#define INF 0x7ffffff int n,maxnlen=,upx,upy,downx,downy;
int aix[maxn],aiy[maxn],maxlen,if_[maxn]; inline void in(int &now)
{
int if_z=;now=;
char Cget=getchar();
while(Cget>''||Cget<'')
{
if(Cget=='-') if_z=-;
Cget=getchar();
}
while(Cget>=''&&Cget<='')
{
now=now*+Cget-'';
Cget=getchar();
}
now*=if_z;
} bool thcheck(int len)
{
int upx_=INF,upy_=-INF,downx_=-INF,downy_=INF;
for(int i=;i<=n;i++)
{
if(if_[i]==||if_[i]==) continue;
if(aix[i]<upx_) upx_=aix[i];
if(aiy[i]>upy_) upy_=aiy[i];
if(aix[i]>downx_) downx_=aix[i];
if(aiy[i]<downy_) downy_=aiy[i];
}
if(max(downx_-upx_,upy_-downy_)<=len) return true;
else return false;
} bool secheck(int len)
{
int upx_=INF,upy_=-INF,downx_=-INF,downy_=INF;
for(int i=;i<=n;i++)
{
if(if_[i]==) continue;
if(aix[i]<upx_) upx_=aix[i];
if(aiy[i]>upy_) upy_=aiy[i];
if(aix[i]>downx_) downx_=aix[i];
if(aiy[i]<downy_) downy_=aiy[i];
}
upx_=upx_+len,downx_=downx_-len,upy_=upy_-len,downy_=downy_+len;
for(int i=;i<=n;i++)
{
if(if_[i]==) continue;
if(aix[i]<=upx_&&aiy[i]>=upy_) if_[i]=;
}
if(thcheck(len)) return true;
for(int i=;i<=n;i++)
{
if(if_[i]==) continue;
if(aix[i]<=upx_&&aiy[i]<=downy_) if_[i]=;
else if_[i]=;
}
if(thcheck(len)) return true;
for(int i=;i<=n;i++)
{
if(if_[i]==) continue;
if(aix[i]>=downx_&&aiy[i]>=upy_) if_[i]=;
else if_[i]=;
}
if(thcheck(len)) return true;
for(int i=;i<=n;i++)
{
if(if_[i]==) continue;
if(aix[i]>=downx_&&aiy[i]<=downy_) if_[i]=;
else if_[i]=;
}
if(thcheck(len)) return true;
else return false;
} bool check(int len)
{
for(int i=;i<=n;i++) if_[i]=;
int upx_=upx+len,downx_=downx-len,upy_=upy-len,downy_=downy+len;
for(int i=;i<=n;i++) if(aix[i]<=upx_&&aiy[i]>=upy_) if_[i]=;
if(secheck(len)) return true;
for(int i=;i<=n;i++)
{
if(aix[i]<=upx_&&aiy[i]<=downy_) if_[i]=;
else if_[i]=;
}
if(secheck(len)) return true;
for(int i=;i<=n;i++)
{
if(aix[i]>=downx_&&aiy[i]>=upy_) if_[i]=;
else if_[i]=;
}
if(secheck(len)) return true;
for(int i=;i<=n;i++)
{
if(aix[i]>=downx_&&aiy[i]<=downy_) if_[i]=;
else if_[i]=;
}
if(secheck(len)) return true;
else return false;
} int main()
{
in(n);
upx=INF,upy=-INF;
downx=-INF,downy=INF;
for(int i=;i<=n;i++)
{
in(aix[i]),in(aiy[i]);
if(aix[i]<upx) upx=aix[i];
if(aiy[i]>upy) upy=aiy[i];
if(aix[i]>downx) downx=aix[i];
if(aiy[i]<downy) downy=aiy[i];
}
maxlen=max(upy-downy,downx-upx);
int l=,r=maxlen,ans=0x7fffffff;
while(l<=r)
{
int mid=l+r>>;
if(check(mid)) ans=mid,r=mid-;
else l=mid+;
}
cout<<ans;
return ;
}
AC日记——[HAOI2007]覆盖问题 bzoj 1052的更多相关文章
- 二分判定 覆盖问题 BZOJ 1052
//二分判定 覆盖问题 BZOJ 1052 // 首先确定一个最小矩阵包围所有点,则最优正方形的一个角一定与矩形一个角重合. // 然后枚举每个角,再解决子问题 #include <bits/s ...
- 1052: [HAOI2007]覆盖问题 - BZOJ
Description 某人在山上种了N棵小树苗.冬天来了,温度急速下降,小树苗脆弱得不堪一击,于是树主人想用一些塑料薄膜把这些小树遮盖起来,经过一番长久的思考,他决定用3个L*L的正方形塑料薄膜将小 ...
- AC日记——地鼠游戏 codevs 1052
1052 地鼠游戏 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 王钢是一名学习成绩优异的学生,在平 ...
- AC日记——[HEOI2012]旅行问题 bzoj 2746
2746 思路: 建立ac自动机,然后把fail树抽出来: 然后在fail树上走lca(神奇): 代码: #include <cstdio> #include <vector> ...
- AC日记——[HAOI2007]理想的正方形 P2216
[HAOI2007] 理想的正方形 思路: 正解多个单调队列: 但是我用树套树水了过去: 来,上代码: #include <cstdio> #include <cstring> ...
- AC日记——[HNOI2008]GT考试 bzoj 1009
1009 思路: KMP上走DP(矩阵加速): DP[i][j]表示当前在第i位,同是匹配到不吉利串的第j位的方案数: 代码: #include <bits/stdc++.h> using ...
- AC日记——明明的烦恼 bzoj 1005
1005 思路: prufer编码+组合数: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 1005 #de ...
- AC日记——Mato的文件管理 bzoj 3289
3289 思路: 莫队求区间逆序对个数,树状数组维护: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 500 ...
- AC日记——[Scoi2010]序列操作 bzoj 1858
1858 思路: 恶心: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 100005 struct Tree ...
随机推荐
- laravel5.5容器
目录 1. 比较典型的例子就是 cache 缓存 2. 容器顾名思义,其实就是完成存取过程 2.1 绑定过程 简单绑定 绑定单例 绑定实例 绑定初始数据 2.2 解析过程 容器主要是为了实现控制反转, ...
- day06_04 购物车讲解02
1.0 补充知识 a,b = [2,3] print(a) print(b) #>>>2 #>>>3 a,b = (2,3) print(a) print(b) # ...
- ironic-conductor与ipa交互clean部分代码分析
clean的动作会在provide和delete阶段才会触发 从代码分析: 对节点执行的node provide/deleted/clean会先发送到ironicclient ironicclient ...
- 剑指offer-从尾到头打印链表03
class Solution: # 返回从尾部到头部的列表值序列,例如[1,2,3] def printListFromTailToHead(self, listNode): # write code ...
- Leetcode 658.找到K个最接近的元素
找到k个最接近的元素 给定一个排序好的数组,两个整数 k 和 x,从数组中找到最靠近 x(两数之差最小)的 k 个数.返回的结果必须要是按升序排好的.如果有两个数与 x 的差值一样,优先选择数值较小的 ...
- HDU 3856 Palindrome ( Manacher + RMQ + 二分 ) WA!!!
不知道错在哪了,求大神指教!!! 思路:用manacher求出每个以str[i]为中心轴的回文串的长度,RMQ预处理区间最大值,对于每个查询,二分最大回文串长,判定是否可行. #include < ...
- class内部处理
class A { public: int foo( ) { return val ; } static int staFun( ) { return staVal ; } static int st ...
- [bzoj4712] 洪水 [树链剖分+线段树+dp]
题面 传送门 思路 DP方程 首先,这题如果没有修改操作就是sb题,dp方程如下 $dp[u]=max(v[u],max(dp[v]))$,其中$v$是$u$的儿子 我们令$g[u]=max(dp[v ...
- joyOI 选课 【树形dp + 背包dp】
题目链接 选课 题解 基础背包树形dp #include<iostream> #include<cstdio> #include<cmath> #include&l ...
- Java并发编程--AQS
概述 抽象队列同步器(AbstractQueuedSynchronizer,简称AQS)是用来构建锁或者其他同步组件的基础框架,它使用一个整型的volatile变量(命名为state)来维护同步状态, ...