1069: [SCOI2007]最大土地面积


Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 3629  Solved: 1432
[Submit][Status][Discuss]

Description


  在某块平面土地上有N个点,你可以选择其中的任意四个点,将这片土地围起来,当然,你希望这四个点围成
的多边形面积最大。

Input


  第1行一个正整数N,接下来N行,每行2个数x,y,表示该点的横坐标和纵坐标。

Output


  最大的多边形面积,答案精确到小数点后3位。

Sample Input



0.5 0.5

Sample Output


1.000

HINT


数据范围 n<=2000, |x|,|y|<=100000

 

分析:


其实自己想想就可以明白,最大的四边形的四个点一定都在凸包上。
那么用graham先求出凸包。
然后就是如何求最大的四边形了。
我们枚举对角线,O(n²)的枚举,然后在对角线两侧找最大的三角形,合起来就是最大的四边形,因为是凸包,三角形的面积变化是类似于二次函数的,并且在旋转对角线的同时,最大三角形面积的那个点也在往相同方向旋转,旋转卡壳就可以了。
总复杂度O(n² )
 

贴上AC代码:


  

# include <iostream>
# include <cstdio>
# include <cstring>
# include <cmath>
# include <algorithm>
using namespace std;
struct data{
double x,y;
}node[],s[];
int n,top;
double ans;
double dis(data a,data b){
return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
}
double mul(data a,data b,data c){
return (a.x - c.x) * (b.y - c.y) - (b.x - c.x) * (a.y - c.y);
}
bool cmp(data a,data b)
{
if(mul(a,b,node[]) == )return dis(a,node[]) < dis(b,node[]);
return mul(a,b,node[]) > ;
}
void Graham(){
int k = ;
for(int i = ;i <= n;i++)
if((node[k].y > node[i].y) || (node[k].y == node[i].y && node[k].x > node[i].x))k = i;
swap(node[k],node[]);
sort(node + ,node + n + ,cmp);
s[++top] = node[],s[++top] = node[];
for(int i = ;i <= n;i++){
while(top && mul(node[i],s[top],s[top - ]) >= )top--;
s[++top] = node[i];
}
}
void rc(){
s[top + ] = node[];
int a,b;
for(int x = ;x <= top;x++){
a = x % top + ;b = (x + ) % top + ;
for(int y = x + ;y <= top;y++){
while(a % top + != y && -mul(s[y],s[a + ],s[x]) > -mul(s[y],s[a],s[x]))a = a % top + ;
while(b % top + != x && -mul(s[b + ],s[y],s[x]) > -mul(s[b],s[y],s[x]))b = b % top + ;
ans = max(-mul(s[y],s[a],s[x]) + -mul(s[b],s[y],s[x]),ans);
}
}
}
int main(){
scanf("%d",&n);
for(int i = ;i <= n;i++)scanf("%lf %lf",&node[i].x,&node[i].y);
Graham();rc();
printf("%.3f",ans / );
return ;
}

[Bzoj1069][Scoi2007]最大土地面积(凸包)(旋转卡壳)的更多相关文章

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

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

  2. [BZOJ1069][SCOI2007]最大土地面积 凸包+旋转卡壳

    1069: [SCOI2007]最大土地面积 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 3669  Solved: 1451[Submit][Sta ...

  3. luogu P4166 [SCOI2007]最大土地面积 凸包 旋转卡壳

    LINK:最大土地面积 容易想到四边形的边在凸包上面 考虑暴力枚举凸包上的四个点计算面积. 不过可以想到可以直接枚举对角线的两个点找到再在两边各找一个点 这样复杂度为\(n^3\) 可以得到50分. ...

  4. bzoj 1069: [SCOI2007]最大土地面积 凸包+旋转卡壳

    题目大意: 二维平面有N个点,选择其中的任意四个点使这四个点围成的多边形面积最大 题解: 很容易发现这四个点一定在凸包上 所以我们枚举一条边再旋转卡壳确定另外的两个点即可 旋(xuan2)转(zhua ...

  5. BZOJ1069 SCOI2007 最大土地面积 凸包、旋转卡壳

    传送门 在这里假设可以选择两个相同的点吧-- 那么选出来的四个点一定会在凸包上 建立凸包,然后枚举这个四边形的对角线.策略是先枚举对角线上的一个点,然后沿着凸包枚举另一个点.在枚举另一个点的过程中可以 ...

  6. bzoj 1069 [SCOI2007]最大土地面积(旋转卡壳)

    1069: [SCOI2007]最大土地面积 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 2277  Solved: 853[Submit][Stat ...

  7. 【BZOJ 1069】【SCOI 2007】最大土地面积 凸包+旋转卡壳

    因为凸壳上对踵点的单调性所以旋转卡壳线性绕一圈就可以啦啦啦--- 先求凸包,然后旋转卡壳记录$sum1$和$sum2$,最后统计答案就可以了 #include<cmath> #includ ...

  8. [SCOI2007]最大土地面积(旋转卡壳)

    首先,最大四边形的四个点一定在凸包上 所以先求凸包 有个结论,若是随机数据,凸包包括的点大约是\(\log_2n\)个 然鹅,此题绝对不会这么轻松,若\(O(n^4)\)枚举,只有50分 所以还是要想 ...

  9. [USACO2003][poj2187]Beauty Contest(凸包+旋转卡壳)

    http://poj.org/problem?id=2187 题意:老题了,求平面内最远点对(让本渣默默想到了悲剧的AHOI2012……) 分析: nlogn的凸包+旋转卡壳 附:http://www ...

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

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=17267 [思路] 凸包+旋转卡壳 求出凸包,用旋转卡壳算出凸包的直 ...

随机推荐

  1. IOS的水滴文件效果

    @implementation ViewController - (void)viewDidLoad{ [super viewDidLoad]; NSDictionary *dict = [NSDic ...

  2. HDU 5414 CRB and String (字符串,模拟)

    题意:给两个字符串s和t,如果能插入一些字符使得s=t,则输出yes,否则输出no.插入规则:在s中选定一个字符c,可以在其后面插入一个字符k,只要k!=c即可. 思路:特殊的情况就是s和t的最长相同 ...

  3. SEO 第三章

    SEO第三章 本次课目标: 1.  掌握关键词的选取方法 2.  掌握关键词的竞争强度分析 3.  掌握关键词的拓展方法 一.关键词的选取 选择关键词的时候可以根据公司网站的定位,围绕公司的主营产品或 ...

  4. execve - 执行程序

    总览 (SYNOPSIS) #include <unistd.h> int execve (const char *filename, char *const argv [], char ...

  5. QT_4_QpushButton的简单使用_对象树

    QpushButton的简单使用 1.1 按钮的创建 QPushButton *btn = new QPushButton; 1.2 btn -> setParent(this);设置父窗口 1 ...

  6. mysql 数据库 show命令

    MySQL中有很多的基本命令,show命令也是其中之一,在很多使用者中对show命令的使用还容易产生混淆,本文汇集了show命令的众多用法. 1. show tables或show tables fr ...

  7. python UDP-数据报协议

    基于udp协议通信的套接字 服务端 from socket import * server = socket(AF_INET, SOCK_DGRAM) # SOCK_DGRAM=>数据报协议 s ...

  8. 5. COLUMNS

    5. COLUMNS 表COLUMNS提供表中列的信息. INFORMATION_SCHEMA Name SHOW Name Remarks TABLE_CATALOG TABLE_SCHEMA TA ...

  9. 9. InnoDB通用表空间

    9. InnoDB通用表空间 通用表空间是InnoDB 使用CREATE TABLESPACE语法创建的共享表空间.本节中的以下主题描述了常规表空间功能和功能: 通用表空间功能 创建通用表空间 将表添 ...

  10. python:零散记录

    1.rstrip()删除末尾指定字符串 例如:A = '1,2,3,4,5,' B = A.rstrip(',') B = '1,2,3,4,5' 2.isdigit()方法 Python isdig ...