UVALive 6902Three Squares(二分 + 搜索)
来源:互联网 发布:高等教育中西差距知乎 编辑:程序博客网 时间:2024/05/03 02:57
题意:
给定N≤105个点,找到边长最小的三个正方形使得可以包住所有的点,求最小边长
分析:
显然的二分边长
考虑check,对于当前点的集合,我们找到一个所有的点的x,y的范围,然后从这个矩形的四个顶点开始搜就好了,搜三层
因为所有的点都是要包括的,所以从顶点开始扩展
代码:
//// Created by TaoSama on 2015-12-14// Copyright (c) 2015 TaoSama. All rights reserved.////#pragma comment(linker, "/STACK:1024000000,1024000000")#include <algorithm>#include <cctype>#include <cmath>#include <cstdio>#include <cstdlib>#include <cstring>#include <iomanip>#include <iostream>#include <map>#include <queue>#include <string>#include <set>#include <vector>using namespace std;#define pr(x) cout << #x << " = " << x << " "#define prln(x) cout << #x << " = " << x << endlconst int N = 1e5 + 10, INF = 0x3f3f3f3f, MOD = 1e9 + 7;int n, x[N], y[N], vis[N];inline void getMin(int &x, int y) {x = min(x, y);}inline void getMax(int &x, int y) {x = max(x, y);}inline bool inBound(int i, int l, int r, int d, int u) { return x[i] >= l && x[i] <= r && y[i] >= d && y[i] <= u;}inline void update(int l, int r, int d, int u, bool v) { for(int i = 1; i <= n; ++i) if(inBound(i, l, r, d, u)) vis[i] = v;}bool dfs(int d, int l) { if(d > 3) { int cnt = 0; for(int i = 1; i <= n; ++i) cnt += vis[i]; return cnt == n; } int minX = INF, maxX = -INF, minY = INF, maxY = -INF; for(int i = 1; i <= n; ++i) { if(vis[i]) continue; getMin(minX, x[i]); getMax(maxX, x[i]); getMin(minY, y[i]); getMax(maxY, y[i]); } //top left update(minX, minX + l, maxY - l, maxY, true); if(dfs(d + 1, l)) return true; update(minX, minX + l, maxY - l, maxY, false); //top right update(maxX - l, maxX, maxY - l, maxY, true); if(dfs(d + 1, l)) return true; update(maxX - l, maxX, maxY - l, maxY, false); //bottom right update(maxX - l, maxX, minY, minY + l, true); if(dfs(d + 1, l)) return true; update(maxX - l, maxX, minY, minY + l, false); //bottom left update(minX, minX + l, minY, minY + l, true); if(dfs(d + 1, l)) return true; update(minX, minX + l, minY, minY + l, false); return false;}int main() {#ifdef LOCAL freopen("C:\\Users\\TaoSama\\Desktop\\in.txt", "r", stdin);// freopen("C:\\Users\\TaoSama\\Desktop\\out.txt","w",stdout);#endif ios_base::sync_with_stdio(0); int t; scanf("%d", &t); while(t--) { scanf("%d", &n); for(int i = 1; i <= n; ++i) scanf("%d%d", x + i, y + i); int l = 0, r = 2e9 + 10; while(l <= r) { int m = l + r >> 1; memset(vis, false, sizeof vis); if(dfs(1, m)) r = m - 1; else l = m + 1; } printf("%d\n", l); } return 0;}
0 0
- UVALive 6902Three Squares(二分 + 搜索)
- uvalive 6902 Three Squares - dfs
- uvalive 3635 - Pie(二分搜索)
- uvalive 3971 - Assemble(二分搜索 + 贪心)
- uvalive 3971 - Assemble(二分搜索 + 贪心)
- uvalive 3635 - Pie(二分搜索)
- POj 2002 UVALive - 3047 C - Squares 【计算几何+二分求解】
- Uvalive 4728 Squares(旋转卡壳)
- UVALive 6168 Fat Ninjas --二分小数+搜索
- POJ 2002 Squares 几何 + 二分搜索 或 hash
- UVALive 6921Refraction(二分)
- uvalive 4254(二分+模拟)
- UVALive 3635 Pie (二分)
- UVALive - 3635 - Pie(二分)
- UVALive 4728 Squares(旋转卡壳求凸包直径)
- ZOJ2347 Squares (POJ2002 二分查找)
- POJ 2002 Squares(简单的二分)
- POJ 2002 Squares(hash+二分查找)
- runtime——函数替换
- 设计模式阅读随笔—组合模式
- mysql => mysql数据库备份 命令
- UVALive 6901String Transformation(贪心)
- 例题5-1 UVA 10474 Where is the Marble?大理石在哪?
- UVALive 6902Three Squares(二分 + 搜索)
- 高精度数字
- mysql =》 mysql 命令恢复数据库
- UVALive 6904Travel Card(dp)
- 安卓直连数据库
- UVALive 6905Two Yachts(费用流)
- ORACLE LINUX 5.11 UDEV绑定asm磁盘问题
- HDU 3016 线段树单点更新+DP
- Java连接数据库