「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. 安装spark 报错:java.io.IOException: Could not locate executable E:\hadoop-2.7.7\bin\winutils.exe

    打开 cmd 输入 spark-shell 虽然可以正常出现 spark 的标志符,但是报错:java.io.IOException: Could not locate executable E:\h ...

  2. httprunner 2.5.7 下.env 文件环境变量的使用及debugtalk的使用,对test的参数化及执行

    一.httprunner 2.5.7 下.env  文件的使用 1..env 文件配置如下: 2.debugtalk.py 编写如下: 在debugtalk.py中增加开始和结束执行语句: 3.需要做 ...

  3. 新版 ZooKeeper 启动时一直报: Starting zookeeper … FAILED TO START

    https://www.pianshen.com/article/74551582443/ 这里引用别人博客,自己验证过,确实如此

  4. 用java实现图书管理系统。

    图书管理系统. 一.项目设计到的知识 1.MVC设计模式思想(分包) >项目分包 >MVC简单介绍 2.GUI(图形化界面) 3.JDBC连接MySql数据库 4.I/O流 5.面向对象思 ...

  5. 【NX二次开发】不健全的双击按钮。

    为什么说不健全,是因为 双击按钮时会先运行单击事件,这个后面再解决.但是模仿某公司的图层操作工具是没有问题了,因为这个工具运行双击事件时本来就需要运行单击事件,不仔细看容易被唬住. 图层操作工具(双击 ...

  6. SpringBoot数据访问(二) SpringBoot整合JPA

    JPA简介 Spring Data JPA是Spring Data大家族的一部分,它可以轻松实现基于JPA的存储库.该模块用于增强支持基于JPA的数据访问层,它使我们可以更加容易地构建使用数据访问技术 ...

  7. ubuntu初识

    简单的Linux系统理解 Ubuntu ctrl+alt 可以令虚拟机释放鼠标,回到主系统中. 如果ubuntu有问题,如何重装? -------直接删除目录.虚拟机内的操作不会影响到宿主机. 1.挂 ...

  8. VisualStudio自动添加注释

    1.VisualStudio  新开页自动添加注释 a 在团队开发或者公司开发中,我们一般都喜欢给自己所创建的类或者接口以及其它模板设置版权说明,但是每个类一个一个的去加又是非常的费劲,所以一般情况下 ...

  9. 【模拟7.14】建造游乐园(play)

    这题是玄学的数论 首先考虑如何枚举偶数点度的图 可以考虑取出i-1个点 那么成图的数量为2^C(i-1,2) (原因单独取出的i点能平衡已建图中的奇数点,原因是某种性质....) 然后求带联通标号的欧 ...

  10. perror()函数的使用

    perror()函数的功能是打印一个系统错误信息.        perror()函数在Linux系统中属于库函数,在头文件中有如下定义: #include <stdio.h>       ...