uvalive 4728 Squares

题意:求所有正方形中两点距离最大值的平方值。

思路:旋转卡壳法。

分别用数组和vector存凸包时,旋转卡壳代码有所不同。

  1 #include<cstdio>
  2 #include<cmath>
  3 #include<cstring>
  4 #include<algorithm>
  5 #include<iostream>
  6 #include<memory.h>
  7 #include<cstdlib>
  8 #include<vector>
  9 #define clc(a,b) memset(a,b,sizeof(a))
 10 #define LL long long int
 11 #define up(i,x,y) for(i=x;i<=y;i++)
 12 #define w(a) while(a)
 13 using namespace std;
 14 const double inf=0x3f3f3f3f;
 15 const int N = 4010;
 16 const double eps = 5*1e-13;
 17 const double PI = acos(-1.0);
 18 using namespace std;
 19
 20 struct Point
 21 {
 22     int x, y;
 23     Point(int x=0, int y=0):x(x),y(y) { }
 24 };
 25
 26 typedef Point Vector;
 27
 28 Vector operator - (const Point& A, const Point& B)
 29 {
 30     return Vector(A.x-B.x, A.y-B.y);
 31 }
 32
 33 int Cross(const Vector& A, const Vector& B)
 34 {
 35     return A.x*B.y - A.y*B.x;
 36 }
 37
 38 int Dot(const Vector& A, const Vector& B)
 39 {
 40     return A.x*B.x + A.y*B.y;
 41 }
 42
 43 int Dist2(const Point& A, const Point& B)
 44 {
 45     return (A.x-B.x)*(A.x-B.x) + (A.y-B.y)*(A.y-B.y);
 46 }
 47
 48 bool operator < (const Point& p1, const Point& p2)
 49 {
 50     return p1.x < p2.x || (p1.x == p2.x && p1.y < p2.y);
 51 }
 52
 53 bool operator == (const Point& p1, const Point& p2)
 54 {
 55     return p1.x == p2.x && p1.y == p2.y;
 56 }
 57
 58 // 点集凸包
 59 // 如果不希望在凸包的边上有输入点,把两个 <= 改成 <
 60 // 注意:输入点集会被修改
 61 vector<Point> ConvexHull(vector<Point>& p)
 62 {
 63     // 预处理,删除重复点
 64     sort(p.begin(), p.end());
 65     p.erase(unique(p.begin(), p.end()), p.end());
 66
 67     int n = p.size();
 68     int m = 0;
 69     vector<Point> ch(n+1);
 70     for(int i = 0; i < n; i++)
 71     {
 72         while(m > 1 && Cross(ch[m-1]-ch[m-2], p[i]-ch[m-2]) <= 0) m--;
 73         ch[m++] = p[i];
 74     }
 75     int k = m;
 76     for(int i = n-2; i >= 0; i--)
 77     {
 78         while(m > k && Cross(ch[m-1]-ch[m-2], p[i]-ch[m-2]) <= 0) m--;
 79         ch[m++] = p[i];
 80     }
 81     if(n > 1) m--;
 82     ch.resize(m);
 83     return ch;
 84 }
 85
 86 // 返回点集直径的平方
 87 int diameter2(vector<Point>& points)
 88 {
 89     vector<Point> p = ConvexHull(points);
 90     int n = p.size();
 91     if(n == 1) return 0;
 92     if(n == 2) return Dist2(p[0], p[1]);
 93     p.push_back(p[0]); // 免得取模
 94     int ans = 0;
 95     for(int u = 0, v = 1; u < n; u++)
 96     {
 97         // 一条直线贴住边p[u]-p[u+1]
 98         for(;;)
 99         {
100             // 当Area(p[u], p[u+1], p[v+1]) <= Area(p[u], p[u+1], p[v])时停止旋转
101             // 即Cross(p[u+1]-p[u], p[v+1]-p[u]) - Cross(p[u+1]-p[u], p[v]-p[u]) <= 0
102             // 根据Cross(A,B) - Cross(A,C) = Cross(A,B-C)
103             // 化简得Cross(p[u+1]-p[u], p[v+1]-p[v]) <= 0
104             int diff = Cross(p[u+1]-p[u], p[v+1]-p[v]);
105             if(diff <= 0)
106             {
107                 ans = max(ans, Dist2(p[u], p[v])); // u和v是对踵点
108                 if(diff == 0) ans = max(ans, Dist2(p[u], p[v+1])); // diff == 0时u和v+1也是对踵点
109                 break;
110             }
111             v = (v + 1) % n;
112         }
113     }
114     return ans;
115 }
116
117 int main()
118 {
119     int T;
120     scanf("%d", &T);
121     while(T--)
122     {
123         int n;
124         scanf("%d", &n);
125         vector<Point> points;
126         for(int i = 0; i < n; i++)
127         {
128             int x, y, w;
129             scanf("%d%d%d", &x, &y, &w);
130             points.push_back(Point(x, y));
131             points.push_back(Point(x+w, y));
132             points.push_back(Point(x, y+w));
133             points.push_back(Point(x+w, y+w));
134         }
135         printf("%d\n", diameter2(points));
136     }
137     return 0;
138 }

时间: 2024-10-05 16:42:17

uvalive 4728 Squares的相关文章

UVALive 4728 Squares (平面最远点对)

题意:n个平行于坐标轴的正方形,求出最远点对的平方 题解:首先求出凸包,可以证明最远点对一定是凸包上的点对,接着可以证明最远点对(每个点的对踵点)一定只有3*n/2对 接着使用旋转卡壳找到最远点对,但是白书上的算法过于麻烦 所以我看到一个简单想法就是: 可以直接枚举每个点,接着枚举这个点对应最远的点(三角形面积最大) 这儿对踵点满足一个单峰性质,所以可以使用类似双指针方式维护 //n个平行于坐标轴的正方形,求出最远点对的平方 #include<cstdio> #include<cstri

UVA 4728 Squares(凸包+旋转卡壳)

题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=17267 [思路] 凸包+旋转卡壳 求出凸包,用旋转卡壳算出凸包的直径即可. [代码] 1 #include<cstdio> 2 #include<vector> 3 #include<iostream> 4 #include<algorithm> 5 using namespace std; 6 7 struct Pt { 8

UVALive 4025 Color Squares(BFS)

题目链接:UVALive 4025 Color Squares 按题意要求涂色,求达到w分的最少步数. //yy:哇,看别人存下整个棋盘的状态来做,我什么都不想说了,不知道下午自己写了些什么东西,训练结束补的.. 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <queue> 5 #define CLR(a, b) memset((a),(b),sizeof

UVALive 6602 Counting Lattice Squares 【几何】【机智】

题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4613 题目大意:给你一个n*m的矩阵格子,在这n*m的矩阵格子中要你选出四个点,形成一个正方形,让正方形的面积为奇数,问可以形成多少个这样的正方形. 题目思路:从每一个奇数开始作为一个基本单元. 面积     边 能组成的正方形: 1*1      1      

LA 4728 (旋转卡壳) Squares

题意: 求平面上的最远点对距离的平方. 分析: 对于这个数据量枚举肯定是要超时的. 首先这两个点一定是在凸包上的,所以可以枚举凸包上的点,因为凸包上的点要比原来的点会少很多,可最坏情况下的时间复杂度也是O(n2). 于是就有了旋转卡壳. 可以想象有两条平行直线紧紧地夹住这个凸包,那直线上的点就是对踵点对.对踵点对最多有四对,就是当凸包的两边和两直线重合的情况. 直线的角度不断变化,直线上的对踵点对也会发生变化,当直线旋转过180°后,那么凸包上所有的对踵点对也就全部遍历到了. 代码中还有很详细的

USACO 1.2 Palindromic Squares

Palindromic SquaresRob Kolstad Palindromes are numbers that read the same forwards as backwards. The number 12321 is a typical palindrome. Given a number base B (2 <= B <= 20 base 10), print all the integers N (1 <= N <= 300 base 10) such that

UVALive 4848 Tour Belt

F - Tour Belt Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Practice UVALive 4848 Description Korea has many tourist attractions. One of them is an archipelago (Dadohae in Korean), a cluster of small islands sca

Partial least squares regression(偏最小二乘法回归)

偏最小二乘法(PLS)是近年来发展起来的一种新的多元统计分析 http://en.wikipedia.org/wiki/Partial_least_squares_regression Partial least squares regression(偏最小二乘法回归),布布扣,bubuko.com

UVALive 6467 Strahler Order 拓扑排序

这题是今天下午BNU SUMMER TRAINING的C题 是队友给的解题思路,用拓扑排序然后就可以了 最后是3A 其中两次RE竟然是因为: scanf("%d",mm); ORZ 以后能用CIN还是CIN吧 QAQ 贴代码了: 1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 #include <math.h> 5 #include <iostre