bzoj2338

计算几何

我们先把所有的线段求出来,我们发现只有两个线段等长且中点重合时才能构成矩形,那么线段有n*n条,我们按中点,长度排序,然后对于一条线段扫描所有符合条件的线段计算答案,这样看起来是O(n^3)次的,实际上远远到不了

但是1336和1765两道题空间较小,不能乱开空间

#include<bits/stdc++.h>
using namespace std;
const int N = 4010;
int n;
double ans;
int x[N], y[N];
struct line {
    int mx, my, x1, x2, y1, y2;
    long long len;
    bool friend operator < (line A, line B) {
        if(A.mx != B.mx) return A.mx < B.mx;
        if(A.my != B.my) return A.my < B.my;
        if(A.len != B.len) return A.len < B.len;
        return true;
    }
    line(int mx, int my, long long len, int x1, int y1, int x2, int y2) : mx(mx), my(my), len(len), x1(x1), y1(y1), x2(x2), y2(y2) {}
};
vector<line> v;
inline long long sqr(long long x) { return x * x; }
inline double Area(line a, line b)
{
    double disa = sqrt(sqr(a.x1 - b.x1) + sqr(a.y1 - b.y1)), disb = sqrt(sqr(a.x2 - b.x1) + sqr(a.y1 - b.y2));
    return disa * disb;
}
int main()
{
//  freopen("crectangle.in", "r", stdin);
//  freopen("crectangle.out", "w", stdout);
    scanf("%d", &n);
    for(int i = 1; i <= n; ++i) scanf("%d%d", &x[i], &y[i]);
    for(int i = 1; i <= n; ++i)
        for(int j = i + 1; j <= n; ++j)
        {
            long long len = sqr(x[i] - x[j]) + sqr(y[i] - y[j]);
            v.push_back(line(x[i] + x[j], y[i] + y[j], len, x[i], y[i], x[j], y[j]));
        }
    sort(v.begin(), v.end());
    for(int i = 1; i < v.size(); ++i)
    {
        line a = v[i];
        for(int j = i - 1; j >= 0; --j)
        {
            line b = v[j];
            if(a.mx != b.mx || a.my != b.my || a.len != b.len) break;
            ans = max(ans, Area(a, b));
        }
    }
    printf("%.0f\n", ans);
//  fclose(stdin);
//  fclose(stdout);
    return 0;
} 

时间: 2024-10-24 11:40:15

bzoj2338的相关文章

【BZOJ2338】[HNOI2011]数矩形 几何

[BZOJ2338][HNOI2011]数矩形 题解:比较直观的做法就是枚举对角线,两个对角线能构成矩形当且仅当它们的长度和中点相同,然后用到结论:n个点构成的矩形不超过n^2.5个(不会证),所以两两枚举对角线即可. #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; typedef long long ll;

BZOJ2338: [HNOI2011]数矩形

题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2338 中学数学老师告诉我们,一个矩形的两条对角线相等,所以只要把所有的边拿出来,记录下中点坐标及长度,然后排一遍序扫一遍更新答案..(听说开double会炸? #include<cstring> #include<cstdio> #include<algorithm> #include<cmath> #include<iostream> #i

bzoj-2338 2338: [HNOI2011]数矩形(计算几何)

题目链接: 2338: [HNOI2011]数矩形 Time Limit: 20 Sec  Memory Limit: 128 MB Description Input Output 题意: 思路: 求最大的矩形面积,先把这些点转化成线段,记录下线段的长度和中点和两个端点,形成矩形说明对角线长度相等,且共中点,所以把线段按长度和中点排序,如果都相等,然后用三角形的三个顶点坐标计算面积的公式计算最大面积就好了; AC代码: /************************************

bzoj2338 数矩形

给出N(N≤1500)个点,求选四个点作为顶点组成矩形的最大面积,保证有解. 对每两个点连边,按边长排序,枚举等长且中点相同的边作为对角线组成矩形,计算面积取最大值. 时间复杂度O(n2logn) #include<cstdio> #include<algorithm> int xs[1600],ys[1600]; long long ans=0; struct edge{ int x1,y1,x2,y2; long long len; int xm,ym; void cal(){

【计算几何】bzoj2338 [HNOI2011]数矩形

对于两条线段,若其中点重合,且长度相等,那么它们一定是某个矩形的对角线. N*N地处理出所有线段,排序,对每一部分中点重合.长度相等的线段进行暴力枚举,更新答案. 用 long double 注意EPS的设置,卡精度. 注意数组大小的设置,容易MLE. 1 #include<cstdio> 2 #include<algorithm> 3 #include<cmath> 4 #include<iostream> 5 using namespace std; 6

屯题计划

感觉lxt一天到晚就是在浪啊浪, 毫无斗志, 颓废得不得了, 每天看小说玩手机到三四点然后整个人都是乱七八糟的. 不行不行我要振作起来了! 从最开始学语言到现在都快两年过去了 T T , 代码能力还是渣成这样简直不能看 T T 觉得应该学学zj爷们屯题. 加油! (题目是直接从劼很久以前的几篇屯题计划里边搬过来的我之前做过的题就删掉了 [BZOJ1822][JSOI2010]Frozen Nova 冷冻波 很水的网络流加计算几何, 然而计算几何部分非常莫名奇妙, 题目应该是判断一个圆是否与一个线

20160515~20160521

上星期生病结果没写题QAQ 健康还是很重要的! 20160516 1.bzoj3932 http://www.lydsy.com/JudgeOnline/problem.php?id=3932 题意:m个任务,任务(Si,Ei,Pi)表示任务从第Si秒开始,在第Ei秒后结束,优先级为Pi.n个询问,每次询问第Xi秒正在运行的任务中,优先级最小的Ki个任务的优先级之和是多少.若Ki大于第Xi秒正在运行的任务总数,输出第Xi秒任务优先级之和.m,n≤100000,强制在线. 代码: 1 #inclu