北京集训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$个点,有若干条跨组 ...
随机推荐
- HDU 3377 Plan (插头DP,变形)
题意:有一个n*m的矩阵,每个格子中有一个值(可能负值),要从左上角走到右下角,求路径的最大花费. 思路: 除了起点和终点外,其他的点可以走,也可以不走. (2)我用的是括号表示法,所以起始状态为') ...
- make 与makefile(会不会写 makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。)
跟我一起写 Makefile /**/ 陈皓 (CSDN) 概述 —— 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉 ...
- 实验3 分支&循环语句(1)
part 1 1.在循环中使用控制语句continue和break,其功能区别是: continue:只控制本次循环的结束. break:终止并跳出循环,之后的循环也不再执行. 2.在两层嵌套循环中 ...
- JS原型、原型链、构造函数、实例与继承
https://cloud.tencent.com/developer/article/1408283 https://cloud.tencent.com/developer/article/1195 ...
- CPP-基础:关于引用
1.什么是“引用”?申明和使用“引用”要注意哪些问题? 引用就是某个目标变量的“别名”(alias),对应用的操作与对变量直接操作效果完全相同. 申明一个引用的时候,切记要对其进行初始化. 引用声明完 ...
- lucene测试类
package test.lucene; import java.io.BufferedReader;import java.io.File;import java.io.FileInputStrea ...
- H3C交换机系统时间设置漏洞
H3C交换机系统时间设置存在漏洞 1. 背景说明 由于在编写<主机房网络延伸实施方案>,调试H3C S5120S-28P-EI交换机时,发现交换机设置成现在的时间后,导致本地用户通过ssh ...
- 【树形dp 最长链】bzoj1912: [Apio2010]patrol 巡逻
富有思维性的树形dp Description Input 第一行包含两个整数 n, K(1 ≤ K ≤ 2).接下来 n – 1行,每行两个整数 a, b, 表示村庄a与b之间有一条道路(1 ≤ a, ...
- Linux rm删除文件未释放空间问题分析
问题描述: 在自己的虚拟机上做实验时出现空间不足情况,检查发现之前的kafka集群测试日志在几天写了 25G,于是进入 /data/kafka01/logs 目录执行 “rm -rf *” 删除所有测 ...
- 无法解析具体reference那个同名文件
公司平台,如果src和gen文件系统中有同名文件.reference时会根据depend.cfg文件优先reference遇到的同名文件.这样如果存在同名文件且引用顺序不对就会有莫名的bug. 像rt ...