题目:

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. EJB开发基础——EJB规范

    1.EJB 容器          Enterprise Bean 是在称作 EJB 容器的特殊环境中运行的软件组件.容器容纳和管理 Enterprise Bean 的方式与 Java Web 服务器 ...

  2. NBUT 1118 Marisa's Affair (排序统计,水)

    题意: 每行给出一个人名和一个int值,人名可重复出现.要求对同一个人名统计int值,最大的先输出,若相同,则按照人名出现次数,若再相同,则按照人名字典序. 思路: 输入完全部进行排序,写个比较函数传 ...

  3. Windows 8.1 explorer.exe 出错 “Application Hang”

    不知道为什么explorer常常会卡一下 看系统日志发现有来源于“Application Hang”的错误 部分常规信息: 程序 explorer.exe 版本 6.3.9600.17415 停止与 ...

  4. javascript基本类型和引用类型,作用域和内存问题

    基本类型(null.undefined.boolean.number.string)和引用类型(Object 对象) 1  基本类型:只能不存一个值,一种类型:从一个变量向另一个变量复制基本类型的值, ...

  5. UVA 753 A Plug for UNIX (最大流)

    关键在建图,转换器连一条容量无限的边表示可以转化无数次,设备的插头连源点,插座连汇点. dinic手敲已熟练,输出格式又被坑,总结一下,输出空行多case的,一个换行是必要的,最后一个不加空行,有Te ...

  6. Open Scene Graph:让VS支持不含后缀的头文件

    让VS支持不含后缀的头文件 看OSG源码时,会遇到不含后缀的头文件无定位信息的尴尬,很让人苦恼. 就是单击VS中“工具菜单栏”——>”选项(O)….”如下图所示: 菜单项,弹出选项对话框,单击“ ...

  7. python爬虫---实现项目(三) Selenium分析美团美食

    上一期博客,我本来想爬取美团美食的,但是由于请求头太复杂,没有破解开其中的几个参数,所以放弃,这次我们来用selenium来模式浏览器抓取数据,我们先来简单看一下流程: 1,利用selenium驱动浏 ...

  8. 洛谷 P1032 字串变换 (BFS)

    题目传送门 我即使是死了,钉在棺材里了,也要在墓里,用这腐朽的声带喊出 STL大法好 这题最麻烦的其实是处理字符串,真正的搜索部分我个人认为也就只有橙题或黄题的难度.而处理字符串,正如前面所说,STL ...

  9. bootstrap历练实例:复选框或单选按钮作为输入框组的前缀或后缀

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  10. python virtualenv学习

     补充:在开发Python应用程序的时候,系统安装的Python3只有一个版本:3.4.所有第三方的包都会被pip安装到Python3的site-packages目录下.   virtualenv就是 ...