「ICPC2017 WF」Money for Nothing

传送门

我们可将生产商和消费商都看成二维平面上的点,其坐标分别为 \((d_i,p_i)\),\((e_i,q_i)\)。

那么问题转变为:

给定平面上的 \(m\) 个 \(A\) 类点 \((d_i,p_i)\),以及 \(n\) 个 \(B\) 类点 \((e_i,q_i)\)。求选择一个 \(A\) 类点作为矩形左下角,一个 \(B\) 类点作为矩形右上角所能得到的最大面积。若不存在这样的矩形就输出零。

考虑如下几种情况。

在这种情况下 \(A_1,A_2\) 都能与 \(B\) 围成一个矩形,但显然 \(A_1\) 更优秀。

故对于这样的 \(A\) 点我们可以直接舍弃。

在这种情况下 \(B_1,B_2\) 都能与 \(A\) 围成一个矩形,但显然 \(B_1\) 更优秀。

故对于这样的 \(B\) 点我们可以直接舍弃。

舍弃掉这些点过后两种点在平面上的排布一定是这样的:

然后我们考虑这样一种情况:

设 \(A_1,B_1\) 围成的矩形是以 \(A_1\) 为左下角的矩形当中最大的那一个。

我们可以得到这样一个结论:

\(A_2\) 和 \(B_2\) 围成的矩形的大小一定小于 \(A_2\) 和 \(B_1\) 围成的矩形的大小。

我们给这几个部分编个号,下面用编号代替上图中的部分。

根据我们前面的条件,有 \(3+4+5>3+4+1+2\rightarrow 5>1+2\)。

我们要证明的即 \(4+6+5+7>4+6+2\rightarrow 5+7>2\rightarrow 1+2+7> 2\)。

所以我们推广一下可以得到这样一个结论:对于每个红点,其围成最大矩形的黄点具有单调性。

根据这个性质我们直接分治就好了。

总时间复杂度为 \(O(n\log_2n)\)。

/*---Author:HenryHuang---*/
/*---Never Settle---*/
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn=5e5+5;
struct cc{
int x,y;
LL operator*(const cc &h)const{
return 1ll*(h.x-x)*(h.y-y);
}
}a[maxn],b[maxn],p[maxn];
int sa,sb;
LL Ans;
void solve(int l,int r,int ll,int rr){
if(l>r||ll>rr) return ;
int mid=(l+r)>>1;
LL ans=-1e18,id=0;
for(int i=ll;i<=rr;++i){
if(a[mid].x<b[i].x||a[mid].y<b[i].y){
if(a[mid]*b[i]>ans){
ans=a[mid]*b[i];
id=i;
}
}
}
if(id!=0){
solve(l,mid-1,ll,id);
solve(mid+1,r,id,rr);
Ans=max(Ans,ans);
} }
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
int m,n;cin>>m>>n;
for(int i=1;i<=m;++i){
cin>>p[i].x>>p[i].y;
}
sort(p+1,p+m+1,[&](cc a,cc b){return a.x==b.x?a.y<b.y:a.x<b.x;});
a[++sa]=p[1];
for(int i=2;i<=m;++i){
if(a[sa].y>p[i].y) a[++sa]=p[i];
}
for(int i=1;i<=n;++i){
cin>>p[i].x>>p[i].y;
}
sort(p+1,p+n+1,[&](cc a,cc b){return a.x==b.x?a.y<b.y:a.x<b.x;});
reverse(p+1,p+n+1);
b[++sb]=p[1];
for(int i=2;i<=n;++i){
if(b[sb].y<p[i].y) b[++sb]=p[i];
}
reverse(b+1,b+sb+1);
for(int i=1;i<=sb;++i) cout<<b[i].x<<' '<<b[i].y<<'\n';
solve(1,sa,1,sb);
cout<<Ans<<'\n';
return 0;
}

GYM101471D「ICPC2017 WF」Money for Nothing的更多相关文章

  1. 前端构建工具之gulp(一)「图片压缩」

    前端构建工具之gulp(一)「图片压缩」 已经很久没有写过博客了,现下终于事情少了,开始写博吧 今天网站要做一些优化:图片压缩,资源合并等 以前一直使用百度的FIS工具,但是FIS还没有提供图片压缩的 ...

  2. fir.im Weekly - 如何打造 Github 「爆款」开源项目

    最近 Android 转用 Swift 的传闻甚嚣尘上,Swift 的 Github 主页上已经有了一次 merge>>「Port to Android」,让我们对 Swift 的想象又多 ...

  3. 更新日志 - fir.im「高级统计」功能上线

    距离 2016 年到来只剩 10 个日夜,fir.im 也准备了一些新鲜的东西,比如「高级统计」功能和「跳转应用商店」功能,帮助你更好地管理.优化应用,欢迎大家试用反馈:) 新增高级统计功能 这次更新 ...

  4. Notepad++ 开启「切分窗口」同时检视、比对两份文件

    Notepad++ 是个相当好用的免费纯文本编辑器,除了内建的功能相当多之外,也支持外挂模块的方式扩充各方面的应用.以前我都用 UltraEdit 跟 Emeditor,后来都改用免费的 Notepa ...

  5. 「zigbee - 1」工欲善其事必先利其器 - IAR for 8051 IDE customization

    最近在实验室做一些 Zigbee 相关的事情,然而一直没在博客上记录啥东西,也不像原来在公司有动力在 Confluence wiki 上扯东扯西.直到前些阵子,跑到 feibit 论坛上(国内较大的一 ...

  6. 「C语言」文件的概念与简单数据流的读写函数

    写完「C语言」单链表/双向链表的建立/遍历/插入/删除 后,如何将内存中的链表信息及时的保存到文件中,又能够及时的从文件中读取出来进行处理,便需要用到”文件“的相关知识点进行文件的输入.输出. 其实, ...

  7. 「C语言」Windows+EclipseCDT下的C语言开发环境准备

    之前写过一篇 「C语言」在Windows平台搭建C语言开发环境的多种方式 ,讨论了如何在Windows下用DEV C++.EclipseCDT.VisualStudio.Sublime Test.Cl ...

  8. 如何对抗 WhatsApp「蓝色双勾」-- 3 个方法让你偷偷看讯息

    WhatsApp 强制推出新功能「蓝色双勾 (✔✔)」 ,让对方知道你已经看过讯息.一众用户反应极大,因为以后不能再藉口说未看到讯息而不回覆.究竟以后 WhatsApp 是否真的「更难用」? 幸好还有 ...

  9. FileUpload控件「批次上传 / 多档案同时上传」的范例--以「流水号」产生「变量名称」

    原文出處  http://www.dotblogs.com.tw/mis2000lab/archive/2013/08/19/multiple_fileupload_asp_net_20130819. ...

随机推荐

  1. Linux分区创建、挂载

    fdisk -l 这块盘是没有分区的,没有被使用. fdisk /dev/vdb 操作这块磁盘, 创建分区 格式化/dev/sdb1为ext4 mkfs -t ext4 /dev/vdb1 mkfs. ...

  2. 计图MPI分布式多卡

    计图MPI分布式多卡 计图分布式基于MPI(Message Passing Interface),主要阐述使用计图MPI,进行多卡和分布式训练.目前计图分布式处于测试阶段. 计图MPI安装 计图依赖O ...

  3. JavaScript 中精度问题以及解决方案

    JavaScript 中的数字按照 IEEE 754 的标准,使用 64 位双精度浮点型来表示.其中符号位 S,指数位 E,尾数位M分别占了 1,11,52 位,并且在 ES5 规范 中指出了指数位E ...

  4. Solon Auth 认证框架使用演示(更简单的认证框架)

    最近看了好几个认证框架,什么 Appache Shiro 啦.Sa-Token 啦.Spring Security啦...尤其是Spring Security,做为对标 Spring Boot &am ...

  5. MySQL必知必会笔记——查询的基础知识

    查询基础知识 第七章 数据过滤 组合where子句 MySQL允许给出多个WHERE子句.这些子 句可以两种方式使用:以AND子句的方式或OR子句的方式使用. AND操作符 可使用AND操作符给WHE ...

  6. 【NX二次开发】Block UI 微定位

    属性说明 属性   类型   描述   常规           BlockID    String    控件ID    Enable    Logical    是否可操作    Group    ...

  7. 理解Spring:IOC的原理及手动实现

    Spring是一个分层的JavaSE/EE full-stack(一站式) 轻量级开源框架.也是几乎所有Java工作者必须要掌握的框架之一,其优秀的设计思想以及其代码实现上的艺术也是我们需要掌握的. ...

  8. MySQL的可重复读级别能解决幻读问题吗?

    之前在深入了解数据库理论的时候,了解到事务的不同隔离级别可能存在的问题.为了更好的理解所以在MySQL数据库中测试复现这些问题.关于脏读和不可重复读在相应的隔离级别下都很容易的复现了. 但是对于幻读, ...

  9. 【模板】O(nlongn)求LIS

    合理运用单调性降低复杂度 平常用的都是O(n^2)的dp求LIS(最长不下降子序列)这里介绍O(nlogn)的算法 分析 对于可能出现的x<y<i且A[y]<A[x]<A[i] ...

  10. [UWP] WinUI 2.6 使用指南

    2021年6月24日,Windows 11 正式对外发布,对于UWP开发者来说,这一天同样值得纪念,因为WinUI 2.6也正式发布了! 相同的时间点意味着一件事,即WinUI 2.6和Windows ...