北京集训TEST13——PA(Goodness)
题目:
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张牌的好感度的差异最大:
【数据规模与约定】
对于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)的更多相关文章
- 北京集训TEST13——PA(第k小数)
题目: Description [问题描述] 从n个数中选若干(至少1)个数求和,求所有方案中第k小的和(和相同但取法不同的视为不同方案).[输入格式] 第一行输入2个正整数n,k. 第二 ...
- 北京集训TEST12——PA( Mortal Kombat)
题目: Description 有一天,有N个外星人企图入侵地球.地球派出全球战斗力最强的M个人代表人类对抗外星人.根据外星的战斗规则,每个外星人应该分别与一名地球人对战(不同的外星人要与不同的地球人 ...
- 【北京集训D2T3】tvt
[北京集训D2T3]tvt \(n,q \le 1e9\) 题目分析: 首先需要对两条路径求交,对给出的四个点的6个lca进行分类讨论.易于发现路径的交就是这六个lca里面最深的两个所形成的链. 然后 ...
- (2016北京集训十)【xsy1528】azelso - 概率期望dp
北京集训的题都是好题啊~~(于是我爆0了) 注意到一个重要的性质就是期望是线性的,也就是说每一段的期望步数可以直接加起来,那么dp求出每一段的期望就行了... 设$f_i$表示从$i$出发不回到$i$ ...
- 【2017 北京集训 String 改编版】子串
题意 你有一个字符串,你需要支持两种操作: 1:在字符串的末尾插入一个字符 \(c\) 2:询问当前字符串的 \([l,r]\) 子串中的不同子串个数 为了加大难度,操作会被加密(强制在线). \(n ...
- 【2016北京集训测试赛(十)】 Azelso (期望DP)
Time Limit: 1000 ms Memory Limit: 256 MB Description 题解 状态表示: 这题的状态表示有点难想...... 设$f_i$表示第$i$个事件经过之 ...
- 【2016北京集训测试赛(二)】 thr (树形DP)
Description 题解 (这可是一道很早就碰到的练习题然后我不会做不想做,没想到在Contest碰到欲哭无泪......) 题目大意是寻找三点对的个数,使得其中的三个点两两距离都为d. 问题在于 ...
- 【2016北京集训测试赛(八)】 crash的数列 (思考题)
Description 题解 题目说这是一个具有神奇特性的数列!这句话是非常有用的因为我们发现,如果套着这个数列的定义再从原数列引出一个新数列,它居然还是一样的...... 于是我们就想到了能不能用多 ...
- 【2016北京集训测试赛(十六)】 River (最大流)
Description Special Judge Hint 注意是全程不能经过两个相同的景点,并且一天的开始和结束不能用同样的交通方式. 题解 题目大意:给定两组点,每组有$n$个点,有若干条跨组 ...
随机推荐
- ejb2.0用本地引用提高EJB访问效率
用本地引用提高EJB访问效率 EJB 1.0和1.1规范只定义了一种在EJB组件中引用另一组件的方法,即通过Bean的远程接口.如果两个Bean都在同一个容器之内,则这种网络开销是不必要的.为解决这个 ...
- ios UnitTest 学习笔记1
一.运行第一个单元测试: 1.在Xcode 5中新建一个工程默认自带一个单元测试的文件夹,IDE自动生成了一个实现XCTestCase的.m文件,里面有一个失败测试(早期版本中实现的是SenTestC ...
- hihoCoder hiho一下 第四十六周 博弈游戏·Nim游戏·三( sg函数 )
题意: 给出几堆石子数量,每次可以取走一堆中任意数量的石头,也可以将一堆分成两堆,而不取.最后取走者胜. 思路: 先规矩地计算出sg值,再对每个数量查SG值就可以了.最后求异或和.和不为0的就是必赢. ...
- 洛谷P1036 选数
题目描述 已知 n 个整数 x1,x2,…,xn,以及一个整数 k(k<n).从 n 个整数中任选 k 个整数相加,可分别得到一系列的和.例如当 n=4,k=3,4 个整数分别为 3,7,12, ...
- 如何在ABAP里用函数式编程思想打印出非波拉契Fibonacci(数列)
在JavaScript里可以用ES6提供的FunctionGenerator这种黑科技来打印非波拉契数列,具体细节参考我这篇文章. 在ABAP里也有很多种方式实现这个需求. 下面这个report分别用 ...
- 一个制作Xcode5插件的模板
原Github地址:https://github.com/kattrali/Xcode5-Plugin-Template 安装将 本工成复制到~/Library/Developer/Xcode/Tem ...
- 一条SQL语句在MySQL中是如何执行的
概览 本篇文章会分析下一个sql语句在mysql中的执行流程,包括sql的查询在mysql内部会怎么流转,sql语句的更新是怎么完成的. 一.mysql架构分析 mysql主要分为Server层和存储 ...
- 爬虫_python3_requests_2
pip install requests 进行简单的操作 发送一个get请求 # 发送请求 import requests response = requests.get('http://httpbi ...
- 三. python面向对象
第七章.面向对象基础 1.面向对象基础 类和对象: a. 创建类 class 类名: def 方法名(self,xxx): pass b. 创建对象 对象 = 类名() c. 通过对象执行方法 对象. ...
- iOS使用技巧---高效使用你的xcode
推荐一遍好文章:绝对可以学到关于xcode的很多哟 转载自cocoachina: http://www.cocoachina.com/ios/20140731/9284.html