[OJ#39]左手右手
[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]左手右手的更多相关文章
- LeetCode OJ 39. Combination Sum
Given a set of candidate numbers (C) and a target number (T), find all unique combinations in C wher ...
- (转)Python新手写出漂亮的爬虫代码1——从html获取信息
https://blog.csdn.net/weixin_36604953/article/details/78156605 Python新手写出漂亮的爬虫代码1初到大数据学习圈子的同学可能对爬虫都有 ...
- Form表单验证组件
Tyrion是一个基于Python实现的支持多个WEB框架的Form表单验证组件,其完美的支持Tornado.Django.Flask.Bottle Web框架.Tyrion主要有两大重要动能: 表单 ...
- Tyrion中文文档(含示例源码)
Tyrion是一个基于Python实现的支持多个WEB框架的Form表单验证组件,其完美的支持Tornado.Django.Flask.Bottle Web框架.Tyrion主要有两大重要动能: 表单 ...
- 《玩转D语言系列》二、D语言现状、基本规定和相关资源介绍
这算是本系列文章的一个序吧,主要是为以后的学习做铺垫,文本分为三个部分,第一部分是对于网上一些比较旧的资料的问题的一些更正,当然我也不可能看过所有的资料,难免会有遗漏.第二部分是D语言最基本的规定,第 ...
- 流量咪教你挖到5G免费流量
自从出现了“抢红包”这个伟大的发明,身边的小伙伴们人人都练就了“左手右手一个快动作”的技能.然而,抢红包只有反应快还不够,还要避免下面这样的悲剧! 为了避免各位小主,因为流量不足而输在抢红包的起跑线上 ...
- [NOIP2012] 提高组 洛谷P1080 国王游戏
题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右 手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排 成一排,国王站在队伍 ...
- AJAX-----07XMLHttpRequest对象的处理返回的JSON类型数据
要玩json首先就需要知道一般都数据是怎么处理的: <!DOCTYPE html> <html lang="en"> <head> <me ...
- XidianOJ 1097 焊板子的xry111
题目描述 我们知道xry111不仅仅代码写的棒,硬件也不是一般人可以比拟的,比如他可以左手右手加上嘴里叼着一个烙铁一起工作,同时焊接三块板子!Orz,现在他的实验室知道他这么厉害了,准备让他焊接N块板 ...
随机推荐
- 尺取法 POJ 3601 Subsequence
题目传送门 /* 题意:求连续子序列的和不小于s的长度的最小值 尺取法:对数组保存一组下标(起点,终点),使用两端点得到答案 1. 记录前i项的总和,求[i, p)长度的最小值,用二分找到sum[p] ...
- 针对谷歌默认最小字体12px的正确解决方案
利用css3的缩放,其最终大小就是:12px * 0.9(缩放比例) = 10.8px; 居然行得通.但回头一想,这么写的话,IE7 IE8会不会不兼容,还是12px呢?不出所料,果然不兼容.此时,又 ...
- SDK manager.exe 运行时报错:系统找不到指定的文件 android.bat
android studio 2.3.1的 SDK Manager工具 突然没有 Launcher XXX 那个按钮,只好到SDK目录中去启动,无奈发生以下错误. 解决办法:运行android.bat ...
- Eclipse打包多渠道包
下面介绍的是在eclipse中使用gradle进行多渠道打包(添加签名+混淆) 1,首先新建一个android测试项目,结构如下图所示: 2,选中右键选择expert->生成gradle文件,如 ...
- iOS---开发实用传感器
传感器 1.什么是传感器 传感器是一种感应\检测装置, 目前已经广泛应用于智能手机上 2.传感器的作用 用于感应\检测设备周边的信息 不同类型的传感器, 检测的信息也不一样 iPhone中的下面现象都 ...
- Struts1 MVC框架的工作原理
MVC英文及Model-View-Controller,分别是模型(Model),视图(View)和控制(Controller).MVC模式的目的是实现web系统的职能分工. View:即用户交互界面 ...
- Laravel 的 API 认证系统 Passport 三部曲(二、passport的具体使用)
GQ1994 关注 2018.04.20 09:31 字数 1152 阅读 1316评论 0喜欢 1 参考链接 Laravel 的 API 认证系统 Passport 三部曲(一.passport安装 ...
- chattr - 修改文件在Linux第二扩展文件系统(E2fs)上的特有属性
SYNOPSIS(总览) chattr [ -RV ] [ -v version ] [ mode ] files... DESCRIPTION(描述) chattr 修改文件在Linux第二扩展文件 ...
- CAD参数绘制椭圆弧(网页版)
在CAD设计时,需要绘制椭圆弧,用户可以设置椭圆弧基本属性. 主要用到函数说明: _DMxDrawX::DrawEllipseArc 绘制椭圆弧.详细说明如下: 参数 说明 DOUBLE dCente ...
- powerdesigner连接MySQL数据库时出现Non SQL Error : Could not load class com.mysql.jdbc.Driver
Non SQL Error : Could not load class com.mysql.jdbc.Driver 这是因为powerdesigner 无法找到驱动所产生的 解决办法是:配置系统的c ...