[OJ#39]左手右手

试题描述

有 n 个人,每个人左右手上各写着一个整数。对于编号为 a 的人和编号为 b 的人, a 对 b 的好感度等于 a 左手上写的数字乘 b 右手上写的数字,a 和 b 的好感度差异等于 a 对 b 的好感度与 b 对 a 的好感度之差的绝对值。

现在,你要从这 n 个人中找出两个人使得他们的好感度差异最大。

输入

第一行一个整数 n。

接下来 n 行,每行两个整数 ai,bi,分别表示第 i 个人左右手上写的数字。

输出

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

输入示例

 -

-
-

输出示例


数据规模及约定

2≤n≤105,−109≤ai,bi≤109

题解

首先我们可以发现两个人 i, j 的好感度差异就是两个向量 (ai, bi) 和 (aj, bj) 的叉积的绝对值。那么要让这个值最大,就是要选择两个向量使得它们围成的三角形面积最大。

我们不妨先枚举其中一个向量 x,可以发现与它叉积绝对值最大的向量 y 一定在凸包上。我们做平行于向量 x 的直线,显然如果向量 y 的终点在直线上,这条直线离原点越远越好,所以一定是在凸包上的。

所以我们先处理出凸包,然后把所有向量按照极角排序,用旋转卡壳的方法去做就可以 O(n) 了。

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <algorithm>
#include <cmath>
using namespace std; int read() {
int x = 0, f = 1; char c = getchar();
while(!isdigit(c)){ if(c == '-') f = -1; c = getchar(); }
while(isdigit(c)){ x = x * 10 + c - '0'; c = getchar(); }
return x * f;
} #define maxn 100010
#define LL long long struct Vec {
LL x, y;
Vec() {}
Vec(LL _, LL __): x(_), y(__) {} Vec operator - (const Vec& t) const { return Vec(x - t.x, y - t.y); }
LL operator ^ (const Vec& t) const { return x * t.y - y * t.x; } bool operator < (const Vec& t) const { return x != t.x ? x < t.x : y < t.y; }
} ps[maxn], poly[maxn];
int cntp, S[maxn], top; bool cmp(Vec a, Vec b) {
return atan2((double)a.y, (double)a.x) > atan2((double)b.y, (double)b.x);
} #define nxt(x) (x + 1) % cntp
#define pre(x) (x + cntp - 1) % cntp int main() {
int n = read();
for(int i = 1; i <= n; i++) {
int a = read(), b = read();
ps[i] = Vec(a, b);
} sort(ps + 1, ps + n + 1);
S[top = 1] = 1;
for(int i = 2; i <= n; i++) {
while(top > 1 && (ps[S[top]] - ps[S[top-1]] ^ ps[i] - ps[S[top]]) >= 0) top--;
S[++top] = i;
}
for(int i = 1; i <= top; i++) poly[cntp++] = ps[S[i]];
int upend = cntp - 1;
S[top = 1] = 1;
for(int i = 2; i <= n; i++) {
while(top > 1 && (ps[S[top]] - ps[S[top-1]] ^ ps[i] - ps[S[top]]) <= 0) top--;
S[++top] = i;
}
for(int i = top - 1; i > 1; i--) poly[cntp++] = ps[S[i]]; sort(ps + 1, ps + n + 1, cmp);
int l = 0, r = upend; LL ans = 0;
for(int i = 1; i <= n; i++) {
while(!((ps[i] ^ poly[nxt(l)] - poly[l]) > 0 ^ (ps[i] ^ poly[l] - poly[pre(l)]) > 0)) l = nxt(l);
while(!((ps[i] ^ poly[nxt(r)] - poly[r]) > 0 ^ (ps[i] ^ poly[r] - poly[pre(r)]) > 0)) r = nxt(r);
ans = max(ans, max(abs(ps[i] ^ poly[l]), abs(ps[i] ^ poly[r])));
}
printf("%lld\n", ans); return 0;
}

[OJ#39]左手右手的更多相关文章

  1. LeetCode OJ 39. Combination Sum

    Given a set of candidate numbers (C) and a target number (T), find all unique combinations in C wher ...

  2. (转)Python新手写出漂亮的爬虫代码1——从html获取信息

    https://blog.csdn.net/weixin_36604953/article/details/78156605 Python新手写出漂亮的爬虫代码1初到大数据学习圈子的同学可能对爬虫都有 ...

  3. Form表单验证组件

    Tyrion是一个基于Python实现的支持多个WEB框架的Form表单验证组件,其完美的支持Tornado.Django.Flask.Bottle Web框架.Tyrion主要有两大重要动能: 表单 ...

  4. Tyrion中文文档(含示例源码)

    Tyrion是一个基于Python实现的支持多个WEB框架的Form表单验证组件,其完美的支持Tornado.Django.Flask.Bottle Web框架.Tyrion主要有两大重要动能: 表单 ...

  5. 《玩转D语言系列》二、D语言现状、基本规定和相关资源介绍

    这算是本系列文章的一个序吧,主要是为以后的学习做铺垫,文本分为三个部分,第一部分是对于网上一些比较旧的资料的问题的一些更正,当然我也不可能看过所有的资料,难免会有遗漏.第二部分是D语言最基本的规定,第 ...

  6. 流量咪教你挖到5G免费流量

    自从出现了“抢红包”这个伟大的发明,身边的小伙伴们人人都练就了“左手右手一个快动作”的技能.然而,抢红包只有反应快还不够,还要避免下面这样的悲剧! 为了避免各位小主,因为流量不足而输在抢红包的起跑线上 ...

  7. [NOIP2012] 提高组 洛谷P1080 国王游戏

    题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右 手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排 成一排,国王站在队伍 ...

  8. AJAX-----07XMLHttpRequest对象的处理返回的JSON类型数据

    要玩json首先就需要知道一般都数据是怎么处理的: <!DOCTYPE html> <html lang="en"> <head> <me ...

  9. XidianOJ 1097 焊板子的xry111

    题目描述 我们知道xry111不仅仅代码写的棒,硬件也不是一般人可以比拟的,比如他可以左手右手加上嘴里叼着一个烙铁一起工作,同时焊接三块板子!Orz,现在他的实验室知道他这么厉害了,准备让他焊接N块板 ...

随机推荐

  1. 彩色模型 分类: 图像处理 Matlab 2015-01-08 20:43 364人阅读 评论(0) 收藏

    彩色模型(又称彩色空间或彩色系统)是描述色彩的一种方法,本质上,彩色模型就是坐标系统和子空间的规范,系统中的每种颜色由单个点来表示.下面介绍两种最常用的彩色模型. 一.RGB彩色模型: RGB模型是最 ...

  2. C#中的list的System.Predicate<in T>和System.Comparison<in T>的应用

    public class Data { ; ; ; ; public Data() { count++; ma = count; } } //一句话删除满足要求的集合 Asm.RemoveAll((D ...

  3. VS Code 设置取消打开文件目录的自动定位跟踪功能。

    文件-->首选项-->设置-->在搜索栏中搜索:explorer.autoReveal;    去掉勾选即可.

  4. Spring数据访问2 - 通过JDBC访问数据库

    因为原生的jdbc操作太复杂,几乎都是建立连接.关闭连接和处理例外等模板式的代码,Spring对此进行了抽象——使用模板来消除样板式代码 ,JdbcTemplate承担了简化数据库访问这块的任务. 利 ...

  5. 《基于Node.js实现简易聊天室系列之总结》

    前前后后完成这个聊天室的Demo花了大概一个星期,当然一个星期是仅仅指编码的工作.前期的知识储备是从0到1从无到有,花费了一定的时间熟悉Node.js的基本语法以及Node.js和mongoDB之间的 ...

  6. SOA测试之浏览器插件

    1. Chrome HTTP Rest Client 插件: 1.1 Postman: https://chrome.google.com/webstore/detail/postman-rest-c ...

  7. iOS--多线程之线程间通讯

    线程间通讯 一.NSThread 1.简单说明 ①线程间通信:在1个进程中,线程往往不是孤立存在的,多个线程之间需要经常进行通信 ②线程间通信的体现 1个线程传递数据给另1个线程 在1个线程中执行完特 ...

  8. InChatter系统之服务客户端的开发

    今天终于开始客户端的开发了,客户端完成以后,我们将可以进行简单的交流.开发完成的程序只是一个很简单的雏形,在本系统完成以后,以及完成的过程中,大家都可以下载源码,在此基础上融入自己的想法和尝试,可以按 ...

  9. 浅谈2015新版 U-Boot

    过了挺长一断时间没有看U-BOOT了,这两天下载了新版的UBOOT源码(之前看的一些书都是基于早好多年的源码来讲述,总感觉心里有点不对劲,也许是我比较喜新的原因吧,不过小弟我并没有厌旧哈),好了不多扯 ...

  10. eureka 注册中心

    1.eureka版本更新后,pom依赖名称变化 v1.2.7spring-cloud-starter-eureka-server v2.0.0spring-cloud-starter-netflix- ...