【HDOJ】5128

暴力+计算几何。

  1 /* 5128 */
  2 #include <iostream>
  3 #include <algorithm>
  4 #include <cstdio>
  5 #include <cstring>
  6 #include <cstdlib>
  7 using namespace std;
  8
  9 typedef struct point {
 10     int x, y;
 11     point() {}
 12     point(int xx, int yy) {
 13         x = xx; y = yy;
 14     }
 15     friend bool operator <(const point &a, const point &b) {
 16         if (a.x == b.x)
 17             return a.y < b.y;
 18         else
 19             return a.x < b.x;
 20     }
 21 } point;
 22
 23 typedef struct {
 24     point v[4];
 25 } square_t ;
 26
 27 #define MAXN 35
 28
 29 int n, m;
 30 point p[MAXN];
 31 point sq[4];
 32 square_t q[10005];
 33
 34 bool isSquare() {
 35     if (sq[0].x!=sq[1].x || sq[0].y!=sq[2].y || sq[1].y!=sq[3].y || sq[2].x!=sq[3].x)
 36         return false;
 37     return sq[0].x!=sq[3].x && sq[0].y!=sq[3].y;
 38 }
 39
 40 bool isTouch(int i, int j) {
 41     for (int u=0; u<4; ++u) {
 42         for (int v=0; v<4; ++v) {
 43             if (q[i].v[u].x==q[j].v[v].x && q[i].v[u].y==q[j].v[v].y)
 44                 return true;
 45         }
 46     }
 47     if ((q[i].v[0].x==q[j].v[0].x || q[i].v[2].x==q[j].v[0].x || q[i].v[0].x==q[j].v[2].x || q[i].v[2].x==q[j].v[2].x) && !(q[j].v[0].y>q[i].v[3].y || q[i].v[0].y>q[j].v[3].y))
 48         return true;
 49     if ((q[i].v[0].y==q[j].v[0].y || q[i].v[2].y==q[j].v[0].y || q[i].v[0].y==q[j].v[2].y || q[i].v[2].y==q[j].v[2].y) && !(q[j].v[0].x>q[i].v[3].x || q[i].v[0].x>q[j].v[3].x))
 50         return true;
 51     return false;
 52 }
 53
 54 bool isCross(int i, int j) {
 55     return q[i].v[0].x<=q[j].v[0].x && q[i].v[0].y<=q[j].v[0].y && q[i].v[3].x>=q[j].v[0].x && q[i].v[3].x>=q[j].v[0].y && q[i].v[3].x<=q[j].v[3].x && q[i].v[3].y<=q[j].v[3].y;
 56 }
 57
 58 bool isIncluded(int i, int j) {
 59     return q[i].v[0].x<q[j].v[0].x && q[i].v[0].y<q[j].v[0].y && q[i].v[3].x>q[j].v[3].x && q[i].v[3].y>q[j].v[3].y;
 60 }
 61
 62 int main() {
 63     int i, j, k, r;
 64     int ans;
 65
 66     #ifndef ONLINE_JUDGE
 67         freopen("data.in", "r", stdin);
 68         freopen("data.out", "w", stdout);
 69     #endif
 70
 71     while (scanf("%d",&n)!=EOF && n) {
 72         for (i=0; i<n; ++i)
 73             scanf("%d %d", &p[i].x, &p[i].y);
 74         if (n < 8) {
 75             puts("imp");
 76             continue;
 77         }
 78         sort(p, p+n);
 79         m = 0;
 80         for (i=0; i<n; ++i) {
 81             for (j=0; j<n; ++j) {
 82                 if (i == j)
 83                     continue;
 84                 for (k=0; k<n; ++k) {
 85                     if (k==i || k==j)
 86                         continue;
 87                     for (r=0; r<n; ++r) {
 88                         if (r==i || r==j || r==k)
 89                             continue;
 90                         sq[0] = p[i];
 91                         sq[1] = p[j];
 92                         sq[2] = p[k];
 93                         sq[3] = p[r];
 94                         sort(sq, sq+4);
 95                         if (isSquare()) {
 96                             q[m].v[0] = sq[0];
 97                             q[m].v[1] = sq[1];
 98                             q[m].v[2] = sq[2];
 99                             q[m].v[3] = sq[3];
100                             ++m;
101                         }
102                     }
103                 }
104             }
105         }
106         ans = -1;
107         for (i=0; i<m; ++i) {
108             for (j=0; j<m; ++j) {
109                 if (i == j)
110                     continue;
111                 if (isTouch(i, j) || isCross(j, i) || isCross(i, j))
112                     continue;
113                 if (isIncluded(i, j)) {
114                     k = (q[i].v[3].x - q[i].v[0].x) * (q[i].v[3].y - q[i].v[0].y);
115                 } else if (isIncluded(j, i)) {
116                     k = (q[j].v[3].x - q[j].v[0].x) * (q[j].v[3].y - q[j].v[0].y);
117                 } else {
118                     k = (q[i].v[3].x - q[i].v[0].x) * (q[i].v[3].y - q[i].v[0].y) +119                         (q[j].v[3].x - q[j].v[0].x) * (q[j].v[3].y - q[j].v[0].y);
120                 }
121                 if (k > ans)
122                     ans = k;
123             }
124         }
125         if (ans < 0)
126             puts("imp");
127         else
128             printf("%d\n", ans);
129     }
130
131     return 0;
132 }
时间: 2024-10-24 22:29:11

【HDOJ】5128的相关文章

【HDOJ】4956 Poor Hanamichi

基本数学题一道,看错位数,当成大数减做了,而且还把方向看反了.所求为最接近l的值. 1 #include <cstdio> 2 3 int f(__int64 x) { 4 int i, sum; 5 6 i = sum = 0; 7 while (x) { 8 if (i & 1) 9 sum -= x%10; 10 else 11 sum += x%10; 12 ++i; 13 x/=10; 14 } 15 return sum; 16 } 17 18 int main() { 1

【HDOJ】1099 Lottery

题意超难懂,实则一道概率论的题目.求P(n).P(n) = n*(1+1/2+1/3+1/4+...+1/n).结果如果可以除尽则表示为整数,否则表示为假分数. 1 #include <cstdio> 2 #include <cstring> 3 4 #define MAXN 25 5 6 __int64 buf[MAXN]; 7 8 __int64 gcd(__int64 a, __int64 b) { 9 if (b == 0) return a; 10 else return

【HDOJ】2844 Coins

完全背包. 1 #include <stdio.h> 2 #include <string.h> 3 4 int a[105], c[105]; 5 int n, m; 6 int dp[100005]; 7 8 int mymax(int a, int b) { 9 return a>b ? a:b; 10 } 11 12 void CompletePack(int c) { 13 int i; 14 15 for (i=c; i<=m; ++i) 16 dp[i]

【HDOJ】3509 Buge&#39;s Fibonacci Number Problem

快速矩阵幂,系数矩阵由多个二项分布组成.第1列是(0,(a+b)^k)第2列是(0,(a+b)^(k-1),0)第3列是(0,(a+b)^(k-2),0,0)以此类推. 1 /* 3509 */ 2 #include <iostream> 3 #include <string> 4 #include <map> 5 #include <queue> 6 #include <set> 7 #include <stack> 8 #incl

【HDOJ】1818 It&#39;s not a Bug, It&#39;s a Feature!

状态压缩+优先级bfs. 1 /* 1818 */ 2 #include <iostream> 3 #include <queue> 4 #include <cstdio> 5 #include <cstring> 6 #include <cstdlib> 7 #include <algorithm> 8 using namespace std; 9 10 #define MAXM 105 11 12 typedef struct {

【HDOJ】2424 Gary&#39;s Calculator

大数乘法加法,直接java A了. 1 import java.util.Scanner; 2 import java.math.BigInteger; 3 4 public class Main { 5 public static void main(String[] args) { 6 Scanner cin = new Scanner(System.in); 7 int n; 8 int i, j, k, tmp; 9 int top; 10 boolean flag; 11 int t

【HDOJ】2425 Hiking Trip

优先级队列+BFS. 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <queue> 5 using namespace std; 6 7 #define MAXN 25 8 9 typedef struct node_st { 10 int x, y, t; 11 node_st() {} 12 node_st(int xx, int yy, int tt)

【HDOJ】1686 Oulipo

kmp算法. 1 #include <cstdio> 2 #include <cstring> 3 4 char src[10005], des[1000005]; 5 int next[10005], total; 6 7 void kmp(char des[], char src[]){ 8 int ld = strlen(des); 9 int ls = strlen(src); 10 int i, j; 11 12 total = i = j = 0; 13 while (

【HDOJ】2795 Billboard

线段树.注意h范围(小于等于n). 1 #include <stdio.h> 2 #include <string.h> 3 4 #define MAXN 200005 5 #define lson l, mid, rt<<1 6 #define rson mid+1, r, rt<<1|1 7 #define mymax(x, y) (x>y) ? x:y 8 9 int nums[MAXN<<2]; 10 int h, w; 11 12