【HDU5964】平行四边形+二维几何

【HDU5964】平行四边形

Time Limit: 4000/2000 MS (Java/Others)Memory Limit: 65536/65536 K (Java/Others)
Problem Description

假设直线L和L’相交于原点O。假设S ={ s1,s2,...,sn }是平面上的n个点。你打 算找四个点满足如下条件:
1. A ∈ L 而 A’ ∈ L’。
2. B,B’都属于S;即 B∈S 且B’∈S。
3. A,A’的中点与B,B’的中点重叠。这意味着ABA’B’是一个平行四边形(或者退 化的平行四边形)。
4. 平行四边形ABA’B’的面积最大。

Input

包含多组测试数据。
第一行有4个整数a, b, a’, b’,分别描述L和L’的坐标方程。具体来说,L的方程 为 ax + by = 0 ;而 L’的方程为 a’x + b’y = 0。
第二行有一个整数n。
接下来n行每行两个整数,表示一对坐标,描述S中的n个点。
保证n <= 106 ,其他输入整数的绝对值不超过104;保证ab’≠ba’,a2+b2>0,a′2+b′2>0。

Output

输出一个整数,表示最大平行四边形的面积四舍五入到整数的值。
保证所有数据中,最大面积在四舍五入前的小数部分在[0,0.4] ⋃ [0.6,1)中。

Sample Input

1 0 0 1
5
1 1
-1 1
-1 -1
1 -1
0 0

Sample Output

2
Hint

enter image description here

Source

2016年中国大学生程序设计竞赛(合肥)-重现赛(感谢安徽大学)
这里写图片描述

题解:我们假设 A l上, C(s,t) ,并且 A l 上,过A点做平行于 l 的平行线,过 A 做平行于 l 的平行线,我们可以得到:

A={ax+by=0cx+dy2(cs+dt)=0A=(2b(cs+dt)bcad,2a(cs+dt)adbc)

A={cx+dy=0ax+by2(as+bt)=0A=(2d(as+bt)adbc,2c(as+bt)bcad)

B=(x3,y3),B=(x4,y4) ,那么 s=x3+x42,t=y3+y42
A=(bc(x3+x4)+bd(y3+y4)bcad,ac(x3+x4)+ad(y3+y4)adbc)
A=(ad(x3+x4)+bd(y3+y4)adbc,ac(x3+x4)+bc(y3+y4)bcad)
显然四边形的面积为 S=|BA×BA|=acx23+bdy23+(ad+bc)x3y3(acx24+bdy24+(ad+bc)x4y4)adbc
adbc 为定值,所以我们定义 f(x,y)=acx2+dby2+(ad+bc)xy ,那么题目就转化为求最大和最小的 f(x,y)

#include <bits/stdc++.h>

using namespace std;
const int INF = 0x3f3f3f3f;
typedef long long LL;
LL a,b,c,d;
LL Min,Max,x,y;
int main() {
    int n;
    while(~scanf("%lld %lld %lld %lld",&a,&b,&c,&d)) {
        scanf("%d",&n);
        Min = 1e17;
        Max = 0;
        for(int i = 0;i<n;i++) {
            scanf("%lld %lld",&x,&y);
            Min = min(Min,a*c*x*x+b*d*y*y+(a*d+b*c)*x*y);
            Max = max(Max,a*c*x*x+b*d*y*y+(a*d+b*c)*x*y);
        }
        printf("%lld\n",LL(fabs(1.0*(Max-Min)/(a*d-b*c))+0.5));
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值