POJ2079:Triangle

传送门

POJ的G++怎么这么辣鸡啊,卡了很长时间。

当时一看数据范围:$N \leq 50000$,就开始往$O(N)$的算法上想。之前做凸包内最大面积四边形是枚举对踵点然后在两边分别找到面积最大的三角形拼接在一起。

所以就直接枚举对踵点然后推进第三个点。

结果wa成一条狗,发现被Discuss里的一组数据给hack掉了。

然后看了别人$O(N)$的做法,似乎是有问题的。

所以索性就直接$O(N^2)$了,谁叫数据水呢hhhh

枚举凸包上任意两个点,推进第三个点统计答案即可。

//POJ2079
//by Cydiater
//2017.1.30
#include <iostream>
#include <cstdio>
#include <cmath>
#include <ctime>
#include <cstring>
#include <string>
#include <queue>
#include <map>
#include <iomanip>
#include <cstdlib>
#include <algorithm>
#include <bitset>
#include <set>
#include <vector>
using namespace std;
#define ll long long
#define up(i,j,n)	for(int i=j;i<=n;i++)
#define down(i,j,n)	for(int i=j;i>=n;i--)
#define cmax(a,b)	a=max(a,b)
#define cmin(a,b)	a=min(a,b)
#define db 		double
#define Vector 		Point
const int MAXN=1e5+5;
const int oo=0x3f3f3f3f;
const db eps=1e-10;
inline int read(){
	char ch=getchar();int x=0,f=1;
	while(ch>‘9‘||ch<‘0‘){if(ch==‘-‘)f=-1;ch=getchar();}
	while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}
	return x*f;
}
struct Point{
	db x,y;
	Point(db x=0,db y=0):x(x),y(y){}
};
Vector operator + (Point x,Point y){return Vector(x.x+y.x,x.y+y.y);}
Vector operator - (Point x,Point y){return Vector(x.x-y.x,x.y-y.y);}
Vector operator * (Vector x,db p){return Vector(x.x*p,x.y*p);}
Vector operator / (Vector x,db p){return Vector(x.x/p,x.y/p);}
int dcmp(db x){if(fabs(x)<eps)return 0;else return x<0?-1:1;}
bool operator < (Vector x,Vector y){return dcmp(x.x-y.x)==0?x.y<y.y:x.x<y.x;}
bool operator == (Vector x,Vector y){return dcmp(x.x-y.x)==0&&dcmp(x.y-y.y)==0;}
int N,top,A;
db ans;
Point V[MAXN],q[MAXN];
namespace solution{
	Point Write(){db x=read(),y=read();return Point(x,y);}
	db Cross(Vector x,Vector y){return x.x*y.y-x.y*y.x;}
	void Prepare(){
		N=read();if(N==-1)exit(0);
		up(i,1,N)V[i]=Write();
		sort(V+1,V+N+1);
		N=unique(V+1,V+N+1)-(V+1);
	}
	void Andrew(){
		top=0;
		up(i,1,N){
			while(top>=2&&Cross(q[top]-q[top-1],V[i]-q[top-1])<=0)top--;
			q[++top]=V[i];
		}
		int lim=top;
		down(i,N-1,1){
			while(top-lim>=1&&Cross(q[top]-q[top-1],V[i]-q[top-1])<=0)top--;
			q[++top]=V[i];
		}
	}
	void Solve(){
		Andrew();
		top--;
		ans=0;
		up(i,1,top){
			int pos=2;
			up(j,i+1,top){
				while(fabs(Cross(q[pos+1]-q[j],q[i]-q[j]))>fabs(Cross(q[pos]-q[j],q[i]-q[j])))(pos%=top)++;
				cmax(ans,fabs(Cross(q[pos]-q[j],q[i]-q[j]))/2);
			}
		}
		printf("%.2lf\n",ans);
	}
}
int main(){
	//freopen("input.in","r",stdin);
	using namespace solution;
	while(true){
		Prepare();
		Solve();
	}
	return 0;
}
时间: 2024-12-05 05:31:48

POJ2079:Triangle的相关文章

(leetcode题解)Pascal&#39;s Triangle

Pascal's Triangle  Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5,Return [ [1], [1,1], [1,2,1], [1,3,3,1], [1,4,6,4,1] ] 题意实现一个杨辉三角. 这道题只要注意了边界条件应该很好实现出来,C++实现如下 vector<vector<int>> generate(int

Lab 1: Write a java program for the triangle problem and test the program with Junit.

Tasks: 1. Install Junit(4.12), Hamcrest(1.3) with Eclipse 将两个jar包添加到工程中 2. Install Eclemma with Eclipse 3. Write a java program for the triangle problem and test the program with Junit. [Description of triangle problem]Function triangle takes three i

Solution to Triangle by Codility

question: https://codility.com/programmers/lessons/4 we need two parts to prove our solution. on one hand, there is no false triangular. Given the array has been sorted, if A[i]+A[i+1]>A[i+2], we can prove the existence of the triangle. for array A i

LeetCode (13) Pascal&#39;s Triangle (杨辉三角 )

题目描述 Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5, Return 从第三行开始,每行除了最左边和最右边两个数为1,其他数字都是上一行中相邻两个数字之和.根据上述规则可以写出下面的代码: class Solution { public: vector<vector<int> > generateRow1() { vector<in

UVA - 11437 - Triangle Fun (计算几何~)

UVA - 11437 Triangle Fun Time Limit: 1000MS Memory Limit: Unknown 64bit IO Format: %lld & %llu Submit Status Description Problem A Triangle Fun Input: Standard Input Output: Standard Output In the picture below you can see a triangle ABC. Point D, E

POJ 1163 The Triangle

题目链接:http://poj.org/problem?id=1163 The Triangle Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 39022   Accepted: 23430 Description 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 (Figure 1) Figure 1 shows a number triangle. Write a program that calculat

LeetCode--Pascal&#39;s Triangle

Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5, Return [ [1], [1,1], [1,2,1], [1,3,3,1], [1,4,6,4,1] ] class Solution { public: vector<vector<int> > generate(int numRows) { vector<vector<in

? (triangle)

2.1 题目描述 给定一个无自环重边的无向图,求这个图的三元环1的个数以及补图2的三元环个数. 2.2 输入格式 第一行 2 个数 n, m ,分别表示图的点数.边数. 接下来 m 行,每行两个数 u, v ,表示一条连接 u, v 的无向边. 2.3 输出格式 一行两个数,依次表示原图的三元环个数以及补图的三元环的个数. 2.4 样例输入 5 5 1 2 1 3 2 3 2 4 3 4 2.5样例输出 2 1 2.6数据范围 对于 30% 的数据:n ≤ 100 对于 60% 的数据:m ≤

POJ 2079 Triangle [旋转卡壳]

Triangle Time Limit: 3000MS   Memory Limit: 30000K Total Submissions: 9525   Accepted: 2845 Description Given n distinct points on a plane, your task is to find the triangle that have the maximum area, whose vertices are from the given points. Input