Description

给定很多个正方形的定点,求这些点中两两之间距离的最大值。

Solution

直接求出凸包后旋转卡壳即可。。

Source

/************************************************* Au: Hany01* Date: Feb 13th, 2018* Prob: [LA4728] Square, Seoul 2009* Email: hany01@foxmail.com
************************************************/#include<bits/stdc++.h>using namespace std;typedef long long LL;
typedef pair<int, int> PII;
#define rep(i, j) for (register int i = 0, i##_end_ = (j); i < i##_end_; ++ i)
#define For(i, j, k) for (register int i = (j), i##_end_ = (k); i <= i##_end_; ++ i)
#define Fordown(i, j, k) for (register int i = (j), i##_end_ = (k); i >= i##_end_; -- i)
#define Set(a, b) memset(a, b, sizeof(a))
#define Cpy(a, b) memcpy(a, b, sizeof(a))
#define fir first
#define sec second
#define pb(a) push_back(a)
#define mp(a, b) make_pair(a, b)
#define ALL(a) (a).begin(), (a).end()
#define SZ(a) ((int)(a).size())
#define INF (0x3f3f3f3f)
#define INF1 (2139062143)
#define Mod (1000000007)
#define debug(...) fprintf(stderr, __VA_ARGS__)
#define y1 wozenmezhemecaiatemplate <typename T> inline bool chkmax(T &a, T b) { return a < b ? a = b, 1 : 0; }
template <typename T> inline bool chkmin(T &a, T b) { return b < a ? a = b, 1 : 0; }inline int read()
{register int _, __; register char c_;for (_ = 0, __ = 1, c_ = getchar(); c_ < '0' || c_ > '9'; c_ = getchar()) if (c_ == '-') __ = -1;for ( ; c_ >= '0' && c_ <= '9'; c_ = getchar()) _ = (_ << 1) + (_ << 3) + (c_ ^ 48);return _ * __;
}inline void File()
{
#ifdef hany01freopen("la4728.in", "r", stdin);freopen("la4728.out", "w", stdout);
#endif
}const double eps = 1e-9;int dcmp(double x) { if (fabs(x) < eps) return 0; return x < 0 ? -1 : 1; }struct Point
{double x, y;Point(double x = 0, double y = 0): x(x), y(y) {}
};
typedef Point Vector;Vector operator + (Vector A, Vector B) { return Vector(A.x + B.x, A.y + B.y); }
Vector operator - (Vector A, Vector B) { return Vector(A.x - B.x, A.y - B.y); }
Vector operator * (Vector A, double p) { return Vector(A.x * p, A.y * p); }
Vector operator / (Vector A, double p) { return Vector(A.x / p, A.y / p); }
bool operator < (Point A, Point B) { return A.x < B.x || (A.x == B.x && A.y < B.y); }
double Dot(Vector A, Vector B) { return A.x * B.x + A.y * B.y; }
double Cross(Vector A, Vector B) { return A.x * B.y - A.y * B.x; }
double dis2(Vector A) { return Dot(A, A); }const int maxn = 400005;int n;
Point p[maxn];inline int ConvexHull(Point* p, int n, Point* q)
{register int m = 0, tmp;sort(p + 1, p + 1 + n);For(i, 1, n) {while (m > 1 && Cross(q[m] - q[m - 1], p[i] - q[m - 1]) >= 0) -- m;q[++ m] = p[i];}tmp = m;Fordown(i, n - 1, 1) {while (m > tmp && Cross(q[m] - q[m - 1], p[i] - q[m - 1]) >= 0) -- m;q[++ m] = p[i];}if (n > 1) -- m;return m;
}inline double RotatingCaliper2(Point* q, int m)
{static Point p[maxn];int n = ConvexHull(q, m, p);double Ans = 0;p[n + 1] = p[1];for (register int u = 1, v = 2; u <= n; ++ u) {for (;;) {int dif = dcmp(Cross(p[u + 1] - p[u], p[v + 1] - p[v]));if (dif >= 0) {chkmax(Ans, dis2(p[u] - p[v]));if (!dif) chkmax(Ans, dis2(p[u] - p[v + 1]));break;}++ (v %= n);}}return Ans;
}int main()
{File();for (register int T = read(); T --; ) {register double x, y, w; register int cnt = 0;n = read();For(i, 1, n)scanf("%lf%lf%lf", &x, &y, &w),p[++ cnt] = Point(x, y), p[++ cnt] = Point(x + w, y),p[++ cnt] = Point(x, y + w), p[++ cnt] = Point(x + w, y + w);printf("%.0lf\n", RotatingCaliper2(p, cnt));}return 0;
}
//寻常一样窗前月,才有梅花便不同。
//    -- 杜耒《寒夜》

【LA 4728】Square, Seoul 2009 (凸包,旋转卡壳)相关推荐

  1. POJ 2187 凸包+旋转卡壳

    思路: 求个凸包 旋转卡壳一下 就求出来最远点对了 注意共线情况 也就是说   凸包如果有一堆点共线保留端点即可 //By SiriusRen #include <cmath> #incl ...

  2. POJ - 2187 Beauty Contest (求距离最远点对-凸包+旋转卡壳/枚举 (旋转卡壳学习))

    链接:https://vjudge.net/problem/POJ-2187 题意:求求距离最远点对. 思路:肯定为凸包上的点,可枚举,也可根据凸包性质旋转卡壳求对踵点. 参考博客: https:// ...

  3. hdu2202 凸包+旋转卡壳

    点击打开hdu2202 思路:最大三角形面积,那么肯定这三个点在最外围,所以先求凸包,然后用旋转卡壳求出那三个点求出面积最大. #include <iostream> #include & ...

  4. 【BZOJ1185】【HNOI2007】最小矩形覆盖(凸包+旋转卡壳)

    传送门 题意:求最小矩阵覆盖 有这样一个结论:矩阵一定有一条边在凸包上(不会证) 那可以枚举每条边 同时旋转卡壳 只是这时不只维护一个对踵点对,同时在左右侧再维护一个最远点 可以发现左右最远点一定是和 ...

  5. Beauty Contest(凸包 + 旋转卡壳(模板))

    Beauty Contest 直接跑一个凸包,然后跑一跑旋转卡壳,求最大值就行了. /*Author : lifehappy */ #include <cstdio> #include & ...

  6. 凸包旋转卡壳(andrew)

    题目链接 如图计算上凸包时判断C1,C2,C3C_1,C_2,C_3C1​,C2​,C3​显然C3C_3C3​是经过A,BA,BA,B的上凸包 可以发现只需要通过A,BA,BA,B即可判断,通过观察可 ...

  7. bzoj1069: [SCOI2007]最大土地面积 凸包+旋转卡壳求最大四边形面积

    在某块平面土地上有N个点,你可以选择其中的任意四个点,将这片土地围起来,当然,你希望这四个点围成的多边形面积最大. 题解:先求出凸包,O(n)枚举旋转卡壳,O(n)枚举另一个点,求最大四边形面积 /* ...

  8. Gym - 102460L Largest Quadrilateral(几何-凸包+旋转卡壳求最大的四边形面积)

    题目链接:点击查看 题目大意:在笛卡尔坐标系上给出 n 个点,要求选出四个点,使得组成的四边形面积最大,求出这个最大的面积,注意此处组成的四边形不是严格意义上的四边形,只需要选四个点就行 题目分析:首 ...

  9. 【BZOJ1069】【SCOI2007】—最大土地面积(凸包+旋转卡壳)

    传送门 考虑枚举任意222个点,那么只需要枚举第二个点的时候旋转卡壳就可以O(n)O(n)O(n)得到最远点对了 #include<bits/stdc++.h> using namespa ...

最新文章

  1. 一盘红烧肉告诉你,本科、硕士和博士区别太大了!
  2. HTML中的button标签的使用,和介绍
  3. 【OpenCV学习】XML的读写
  4. FineReport单行与数据库交互的方法
  5. mysql 不需要@的变量_mysql参数变量
  6. C#开发微信门户及应用(28)--微信“摇一摇·周边”功能的使用和接口的实现
  7. 为何各家抢滩物联网?
  8. 鸿蒙系统可以安装teams吗,鸿蒙致命弱点被曝光!不能装这个软件,80%用户将望而却步!...
  9. 使用spring data Querydsl 实现动态查询功能
  10. ARUA2017创新转型峰会(ATIC)启动上海
  11. SStap 测试UDP转发...未通过!
  12. Golang AES加密解密
  13. Android 9 (P)在user模式下无法使用fastboot烧录怎么破
  14. 错误处理(一)—— 被呼叫方拒绝接收呼叫。 (异常来自 HRESULT:0x80010001 (RPC_E_CALL_REJECTED))
  15. 迁移系统:换电脑或者硬盘转移磁盘文件的方法!
  16. 卷积神经网络的三个特性
  17. matlab不支持复数输入,高版本MATLAB中medfilt1函数不支持复数问题
  18. 【零信任落地案例】北京芯盾时代电信运营商零信任业务安全解决方案落地项目
  19. python星座分析
  20. 微信小程序开发基础教程

热门文章

  1. 基于python的Django框架购物商城设计与实现毕业设计毕设参考
  2. 公司出路:与速达ERP合作设想
  3. 太空射击 第07课: 添加图形
  4. 【编程】shell和python实现:如何做到让一个程序每1秒去做一件事情
  5. html5怎么调用cur指针,鼠标指针.cur.ani导出与制作
  6. 连作业都不会抄!盘点那些年被淘宝直播带沟里的直播平台
  7. [教你做小游戏] 用86行代码写一个联机五子棋WebSocket后端
  8. 【red hat设置用户密码】passwd命令设置初始口令
  9. 艾宾浩斯记忆法和遗忘曲线
  10. 讨论▍数据分析师(非数据挖掘,偏业务)是青春饭吗?