HDU 5023 A Corrupt Mayor's Performance Art (计算几何、血坑)

题意:

N<=30,2cross,touch,2imp

分析:

线2,2,
2,2,
touch,cross,4

血坑:

大的完全包含小的矩形的情况是合法的。。。。。。

代码:

//
//  Created by TaoSama on 2015-10-23
//  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 << endl
const int N = 1e5 + 10, INF = 0x3f3f3f3f, MOD = 1e9 + 7;

int n;

struct Point {
    int x, y;
    Point(int x = 0, int y = 0): x(x), y(y) {}
    void input() {
        scanf("%d%d", &x, &y);
    }
    void print() {
        cout << x << ' ' << y << endl;
    }
} A[35];

bool vis[205][205];

int l, r, up, down;

bool onLine(Point& a, Point& b) {
    return a.x == b.x || a.y == b.y;
}

bool isLegal(Point& a) {
    if(a.x >= l && a.x <= r && a.y >= down && a.y <= up) return 0;
    return 1;
}
bool isIn(Point& a) {
    return (a.x > l && a.x < r && a.y > down && a.y < up);
}

int getRectArea(Point a, Point b, Point& c, Point& d) {
    if(a.x > b.x) swap(a, b);
    c = Point(a.x, b.y), d = Point(b.x, a.y);
    if(vis[c.x][c.y] && vis[d.x][d.y])
        return abs(a.x - b.x) * abs(a.y - b.y);
    return -INF;
}

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);

    while(scanf("%d", &n) == 1 && n) {
        memset(vis, false, sizeof vis);
        for(int i = 1; i <= n; ++i) {
            A[i].input();
            vis[A[i].x][A[i].y] = true;
        }
        int ans = -INF;
        Point C, D;
        for(int a = 1; a <= n; ++a) {
            for(int b = 1; b <= n; ++b) {
                if(onLine(A[a], A[b])) continue;

                int tmp = getRectArea(A[a], A[b], C, D);
                if(tmp == -INF) continue;

                l = min(A[a].x, A[b].x), r = max(A[a].x, A[b].x);
                down = min(A[a].y, A[b].y), up = max(A[a].y, A[b].y);

                for(int c = 1; c <= n; ++c) {
                    for(int d = 1; d <= n; ++d) {
                        if(onLine(A[c], A[d])) continue;

                        int tmp2 = getRectArea(A[c], A[d], C, D);
                        if(tmp2 == -INF || tmp < tmp2) continue;
                        if(isIn(A[c]) && isIn(A[d]) && isIn(C) && isIn(D)) {
                            ans = max(ans, tmp);
                        }
//                        if(tmp == 3){
//                            A[a].print();
//                            A[b].print();
//                            A[c].print();
//                            A[d].print();
//                            cout << "max" << endl;
//                        }
                        if(!isLegal(A[c]) || !isLegal(A[d]) || !isLegal(C) || !isLegal(D))
                            continue;

                        ans = max(ans, tmp + tmp2);
//                        if(tmp + tmp2 == 3){
//                            A[a].print();
//                            A[b].print();
//                            A[c].print();
//                            A[d].print();
//                            cout << endl;
//                        }
                    }
                }
            }
        }
        if(ans != -INF) printf("%d\n", ans);
        else puts("imp");
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值