题目:

Description

桌面上放有 n 张卡牌。对于每张卡牌,一面是绿色的,另一面是红色的。卡牌的每一面都标有一个整数。对于卡牌a和卡牌b,卡牌a对卡牌b的好感度为卡牌a绿色面的数与卡牌b红色面的数的乘积。

举个例子,如果卡牌a绿色面标有10,红色面标有3;卡牌b绿色面标有7,红色面标有-2。那么a对b的好感度为 10×(−2)=−20 ,b对a的好感度为 7×3=21 。则a和b的好感度的差异为 |21−(−20)|=41 。

现在,你知道这 n 张卡牌每一面的数,请你找出两张卡牌,使得他们好感度的差异最大。

Input

第一行为一个整数 n ,表示卡牌的数量。

接下来n行,每行两个整数 gi,ri ,分别表示第i张卡牌绿色面和红色面的数。

Output

        输出一个整数:好感度差异的最大值。

Sample Input

5
9 -1
7 8
-2 4
9 -6
3 5

Sample Output

114

HINT

【样例解释】

第2张和第4张牌的好感度的差异最大:

9×8−7×(−6)=114

【数据规模与约定】

对于20%的数据,n≤3000

对于另外20%的数据,数据保证随机

对于所有数据,2≤n≤105,−109≤gi,ri≤109

题解:

解法:凸包。

首先,把(g[i], r[i])看成平面上的点,所求的值即为三角形(原点、a、b)面积的最大值的两倍(a, b为卡牌)。

其次,选出的两张卡牌一定是凸包上的点。下面证明:

假设两张卡牌都不是凸包上的点,则任选这两点中的一点a与原点O连成直线。则现在的目标是选择另外一点b使得三角形Oab的面积最大。将所有点往直线Oa作高发现,与直线Oa距离最远的点一定是凸包上的点,与假设矛盾。

假设一张卡牌a是凸包上的点,另一张卡牌b不是,仍可按照上面的方法证明b一定是凸包上的点,从而使假设矛盾。

如果数据是随机的话,把凸包上的点找出来(大概也就40个左右),O(n^2)枚举一下即可。

但是后面60%的数据都是我构造的,O(n^2)可能过不了(不排除有些同学水得比较高超把它们都水过了)~

我们可以枚举凸包上的一个点a,通过二分/三分找到离直线Oa最远的点。

本题标程时间复杂度O(n log n)

心得:

  凸包的旋转卡壳的运用(注意枚举所有点··不然会漏,因为不一定是单峰的)

代码:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<cctype>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
const int N=3e5+;
struct point
{
long long x;
long long y;
}p[N],q[N];
inline point operator -(point a,point b)
{
point t;
t.x=a.x-b.x;
t.y=a.y-b.y;
return t;
}
inline long long operator *(point a,point b)
{
return a.x*b.y-a.y*b.x;
}
inline long long norm(point a)
{
return a.x*a.x+a.y*a.y;
}
int n,m;
long long green[N],red[N];
long long ans=;
long long jdz(long long x)
{
return x>?x:-x;
}
bool comp(int u,int v)
{
long long det=(p[u]-p[])*(p[v]-p[]);
if(det!=) return det>;
else return norm(p[u]-p[])<norm(p[v]-p[]);
}
bool compx(point a,point b)
{
point po;
po.x=,po.y=;
point a1=a-po;
point b1=b-po;
if(a1*b1!=) return a1*b1>;
else return norm(a)<norm(b);
}
void tubao()
{
int id=;
for(int i=;i<=n;i++)
if((p[i].x<p[id].x)||(p[i].x==p[id].x&&p[i].y<p[id].y))
id=i;
if(id!=) swap(p[id],p[]);
int per[N];
for(int i=;i<=n;i++)
per[i]=i;
sort(per+,per+n+,comp);
q[++m]=p[];
for(int i=;i<=n;i++)
{
int j=per[i];
while(m>=&&(p[j]-q[m-])*(q[m]-q[m-])>=) m--;
q[++m]=p[j];
}
sort(q+,q+m+,compx);
}
long long area(int a,int b)
{
return jdz(q[a]*q[b]);
}
int main()
{
// freopen("a.in","r",stdin);
//freopen("a.out","w",stdout);
scanf("%d",&n);
if(n<=)
{
for(int i=;i<=n;i++)
scanf("%lld%lld",&green[i],&red[i]);
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
{
if(i==j) continue;
long long temp1=green[i]*red[j];
long long temp2=green[j]*red[i];
ans=max(ans,temp1-temp2);
}
printf("%lld",ans);
}
else
{
for(int i=;i<=n;i++)
scanf("%lld%lld",&p[i].x,&p[i].y);
point temp;
temp.x=;
temp.y=;
p[++n]=temp;
tubao();
for(int i=,j=;i<=m;i++)
{
while(true)
{
int k=j==n?:j+;
if(area(i,j)>=area(i,k)) break;
else j=k;
}
ans=max(ans,area(i,j));
}
printf("%lld\n",ans);
}
return ;
}

北京集训TEST13——PA(Goodness)的更多相关文章

  1. 北京集训TEST13——PA(第k小数)

    题目: Description [问题描述] 从n个数中选若干(至少1)个数求和,求所有方案中第k小的和(和相同但取法不同的视为不同方案).[输入格式]    第一行输入2个正整数n,k.    第二 ...

  2. 北京集训TEST12——PA( Mortal Kombat)

    题目: Description 有一天,有N个外星人企图入侵地球.地球派出全球战斗力最强的M个人代表人类对抗外星人.根据外星的战斗规则,每个外星人应该分别与一名地球人对战(不同的外星人要与不同的地球人 ...

  3. 【北京集训D2T3】tvt

    [北京集训D2T3]tvt \(n,q \le 1e9\) 题目分析: 首先需要对两条路径求交,对给出的四个点的6个lca进行分类讨论.易于发现路径的交就是这六个lca里面最深的两个所形成的链. 然后 ...

  4. (2016北京集训十)【xsy1528】azelso - 概率期望dp

    北京集训的题都是好题啊~~(于是我爆0了) 注意到一个重要的性质就是期望是线性的,也就是说每一段的期望步数可以直接加起来,那么dp求出每一段的期望就行了... 设$f_i$表示从$i$出发不回到$i$ ...

  5. 【2017 北京集训 String 改编版】子串

    题意 你有一个字符串,你需要支持两种操作: 1:在字符串的末尾插入一个字符 \(c\) 2:询问当前字符串的 \([l,r]\) 子串中的不同子串个数 为了加大难度,操作会被加密(强制在线). \(n ...

  6. 【2016北京集训测试赛(十)】 Azelso (期望DP)

    Time Limit: 1000 ms   Memory Limit: 256 MB Description 题解 状态表示: 这题的状态表示有点难想...... 设$f_i$表示第$i$个事件经过之 ...

  7. 【2016北京集训测试赛(二)】 thr (树形DP)

    Description 题解 (这可是一道很早就碰到的练习题然后我不会做不想做,没想到在Contest碰到欲哭无泪......) 题目大意是寻找三点对的个数,使得其中的三个点两两距离都为d. 问题在于 ...

  8. 【2016北京集训测试赛(八)】 crash的数列 (思考题)

    Description 题解 题目说这是一个具有神奇特性的数列!这句话是非常有用的因为我们发现,如果套着这个数列的定义再从原数列引出一个新数列,它居然还是一样的...... 于是我们就想到了能不能用多 ...

  9. 【2016北京集训测试赛(十六)】 River (最大流)

    Description  Special Judge Hint 注意是全程不能经过两个相同的景点,并且一天的开始和结束不能用同样的交通方式. 题解 题目大意:给定两组点,每组有$n$个点,有若干条跨组 ...

随机推荐

  1. java动态代理使用详解

    我们都知道AOP的原理就是java的动态代理机制,下面我就对java的动态代理机制进行学习与总结 java动态代理的实现有两个重要的类: Proxy:类 作用就是用来动态创建一个代理对象的类 Invo ...

  2. cookie安全

    www.baidu.com host 文件 定义 a.baidu.com 为127.0.01 本地编写php程序 读取浏览器发送给 a.baidu.com的cookie 会把 .baidu.com域下 ...

  3. JS对输入判断变化屏蔽中文输入法输入时连续触发事件的方法

    代码如下: //智能搜索提示 IntelligenceSearch: function IntelligenceSearch() { $('#keyWord').on('input', functio ...

  4. htmlunit抓取js执行后的网页源码

    上次我不是写了一个自动抓取博客访问量吗 (点击打开链接) 可是昨天晚上我又运行的时候,发现不能用了.. 运行了几次 发现使用URLConnection 得到的网页源码和浏览器直接查看的不同. URLC ...

  5. java.lang.NoClassDefFoundError: org/w3c/dom/ElementTraversal问题解决

    使用Maven构建项目并加载spring配置文件时,报如下异常 Caused by: java.lang.ClassNotFoundException: org.w3c.dom.ElementTrav ...

  6. 补题—Codeforces Round #346 (Div. 2) _智商欠费系列

    这次的题目相对容易 但是智商依旧不够用 原因有三点 1.英文水平堪忧 2 逻辑不严密 3 细节掌握不够好 传送门 http://codeforces.com/contest/659 A 题目大意 圆环 ...

  7. Android(java)学习笔记142:Android中补间动画(Tween Animation)

    本文主要简单介绍补间动画使用代码实现, 关于使用xml实现补间动画, 可以参看:自定义控件三部曲之动画篇(一)——alpha.scale.translate.rotate.set的xml属性及用法 1 ...

  8. socket的BeginConnect(EndPoint remoteEP,AsyncCallback callback,objcet state);个人理解

    1.socket.BeginConnect(); 其中的三个参数值EndPoint remoteEP,这个是用来指定连接的socket服务器的的地址 socket参数表 EndPoint remote ...

  9. ERROR 2059 (HY000): Authentication plugin 'caching_sha2_password' cannot be loaded: /usr/lib64/mysql/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory

    部署docker下的mysql时出现以下报错 [root@docker ~]# mysql -h192.168.30.22 -uroot -p Enter password: 出现报错: ERROR ...

  10. HDU-1312-Black and Red

    这题其实和POJ的1979是同一道题,当时POJ使用cin写的,所以读入的时候,就很正确. 这次用scanf读入的时候,就出现了问题,我们在读完宽高之后,要用getchar吸收掉回车,然后每行末尾的回 ...