BZOJ2338: [HNOI2011]数矩形

BZOJ2338: [HNOI2011]数矩形

https://lydsy.com/JudgeOnline/problem.php?id=2338

分析:

  • 一个容易想出的做法就是把线段按中点和长度排序,把相等的放在一起处理。
  • 这样做的复杂度是\(O(n^2logn+矩形个数)\)的。
  • 矩形个数是\(O(n^{2.5})\)的。

代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
#include <vector>
#include <iostream>
#include <cmath>
using namespace std;
#define N 1550
#define eps 1e-8
typedef long long ll;
ll pf(ll x) {return x*x;}
struct Point {
	ll x,y;
	Point() {}
	Point(ll x_,ll y_) {x=x_,y=y_;}
	bool operator < (const Point &p) const {
		return x==p.x ? y<p.y : x<p.x;
	}
	Point operator - (const Point &p) const {return Point(x-p.x,y-p.y);}
}a[N];
ll dis(const Point &p1,const Point &p2) {return pf(p1.x-p2.x)+pf(p1.y-p2.y);}
ll cross(const Point &p1,const Point &p2) {return p1.x*p2.y-p1.y*p2.x;}
struct A {
	Point p1,p2,p3;
	bool operator < (const A &u) const {
		ll tmp=dis(p1,p2)-dis(u.p1,u.p2);
		return tmp==0 ? p3<u.p3 : tmp<0;
	}
}b[N*N];
int n;
ll ans;
int main() {
	scanf("%d",&n);
	int i,j,k;
	int m=0;
	for(i=1;i<=n;i++) scanf("%lld%lld",&a[i].x,&a[i].y);
	for(i=1;i<=n;i++) for(j=i+1;j<=n;j++) {
		Point p3=Point((a[i].x+a[j].x),(a[i].y+a[j].y));
		b[++m]=(A){a[i],a[j],p3};
	}
	sort(b+1,b+m+1);
	j=1;
	for(i=2;i<=m;i++) {
		for(;j<i&&(dis(b[j].p1,b[j].p2)!=dis(b[i].p1,b[i].p2)||b[j].p3<b[i].p3||b[i].p3<b[j].p3);j++) ;
		for(k=j;k<i;k++) {
			ans=max(ans,abs(cross(b[k].p1-b[i].p1,b[k].p2-b[i].p1)));		
		}
	}
	printf("%lld\n",ans);
}

posted @ 2019-01-01 18:46  fcwww  阅读(133)  评论(0编辑  收藏  举报