题目链接:点击查看

题目大意:在二维平面中给出 n 个点可以作为矩形左下角的点,再给出 m 个点可以作为矩形右上角的点,现在问最大可以构造出多大面积的矩形,即如何选择,可以使得 ( b[ j ] . x - a[ i ] . x ) * ( b[ j ] . y - a[ i ] . y ) 最大

题目分析:首先贪心去想,对于矩形左下角的点来说,如果存在着两个点 A( x1 , y1 ),B( x2 , y2 ),满足 x1 < y1 且 x2 < y2 的话,那么点 A 一定是要比点 B 永远都是更优的,所以可以直接把点 B 删除掉,对于矩形右上角的点也是同理,这个操作在预处理时线性遍历一遍就可以完成,贪心完成后剩余的点应该如下图所示:

如果用图示画出来的话,应该往斜率优化dp或者决策单调性方面去想,因为是二维的点,斜率优化的话需要三维凸包,所以考虑决策单调性

简单来说就是,设数组 a 是左下角的点,数组 b 是右下角的点,如果 a[ i ] 和 b[ j ] 是最优的,也就是 a[ i ] 和 b[ j - 1 ] 不是最优的,那么 a[ i + 1 ] 一定不可能和 b[ j - 1 ] 是最优的,证明如下:

所以不难看出,最后的化简的公式与假设相悖,所以得证

如此一来就可以分治去解决了,具体策略如下:设 solve( l1 , r1 , l2 , r2 ) 为当前区间的询问区间为 [ l1 , r1 ] ,决策所在区间为 [ l2 , r2 ] 时的最优答案,即 [ l1 , r1 ] 对应的是数组 a,[ l2 , r2 ] 对应的是数组 b,每次选择询问区间的中位数去决策区间中寻找最优决策设为 pos,根据决策单调性不难看出,[ l1 , mid - 1 ] 的决策只可能在 [ l1 , pos ] 中出现,同理 [ mid + 1 , r1 ] 的决策只可能在 [ pos , r2 ] 中出现,如此递归下去时间复杂度是 O( nlogn ) 级别的

有一点小细节就是,有可能决策为负数,或者 a 变成了矩阵的右上角端点,b 变成了矩阵的左下角端点,此时的决策应该是负无穷(不应该出现这种情况),虽然决策为负数时无法更新答案,但是却可以更新相对的最优情况,如此分治下去肯定是最优的

代码:

//#pragma GCC optimize(2)
//#pragma GCC optimize("Ofast","inline","-ffast-math")
//#pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
using namespace std;typedef long long LL;typedef unsigned long long ull;const LL inf=0x3f3f3f3f3f3f3f3f;const int N=1e6+100;int n,m;bool ban[N];struct Node
{LL x,y;void input(){scanf("%lld%lld",&x,&y);}bool operator<(const Node& t)const{if(x!=t.x)return x<t.x;return y<t.y;}
}a[N],b[N];void init_a()
{sort(a+1,a+1+n);memset(ban,false,sizeof(ban));int last=1;for(int i=2;i<=n;i++){if(a[i].y>=a[last].y)ban[i]=true;elselast=i;}int tot=0;for(int i=1;i<=n;i++)if(!ban[i])a[++tot]=a[i];n=tot;
}void init_b()
{sort(b+1,b+1+m);memset(ban,false,sizeof(ban));int last=m;for(int i=m-1;i>=1;i--){if(b[i].y<=b[last].y)ban[i]=true;elselast=i;}int tot=0;for(int i=1;i<=m;i++)if(!ban[i])b[++tot]=b[i];m=tot;
}LL cal(int i,int j)
{if(b[j].x<a[i].x&&b[j].y<a[i].y)return -inf;return (b[j].x-a[i].x)*(b[j].y-a[i].y);
}LL solve(int l1,int r1,int l2,int r2)//a[l1,r1],b[l2,r2]
{if(l1>r1||l2>r2)return 0;int mid=l1+r1>>1;int pos=l2;for(int i=l2+1;i<=r2;i++)if(cal(mid,pos)<cal(mid,i))pos=i;return max({solve(l1,mid-1,l2,pos),solve(mid+1,r1,pos,r2),cal(mid,pos)});
}int main()
{
#ifndef ONLINE_JUDGE
//  freopen("data.ans.txt","r",stdin);
//  freopen("data.out.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)a[i].input();for(int i=1;i<=m;i++)b[i].input();init_a();init_b();printf("%lld\n",solve(1,n,1,m));return 0;
}

Gym - 101471D Money for Nothing(决策单调性+分治+贪心)相关推荐

  1. bzoj1897. tank 坦克游戏(决策单调性分治)

    题目描述 有这样一款新的坦克游戏.在游戏中,你将操纵一辆坦克,在一个N×M的区域中完成一项任务.在此的区域中,将会有许多可攻击的目标,而你每摧毁这样的一个目标,就将获得与目标价值相等的分数.只有获得了 ...

  2. 【决策单调性分治优化/四边形不等式优化】监狱警卫

    前言 模板一套就AC了... 题目 guardians.cpp 1S/128M 你负责将监狱的警卫指派到最疯狂的罪犯所在的监狱. 一共有N间牢房排列成一行,编号从1~N. 第i间牢房恰好容纳了一个疯狂 ...

  3. 2020-2021 ACM-ICPC, Asia Seoul Regional Contest L. Two Buildings (决策单调性 分治)

    linkkkkkk 题意: 给定长度为nnn的数组ccc,求max((j−i)∗(ci+cj))max((j-i)*(c_i+c_j))max((j−i)∗(ci​+cj​)) 思路: 将式子转化为m ...

  4. [决策单调性 分治 主席树] BZOJ 4367 [IOI2014]holiday假期

    比较显然的做法 枚举l,r 然后主席树 这题有很多单调性 可以利用 对一个确定的l 最优的r 是单调的 来分治 #include<cstdio> #include<cstdlib&g ...

  5. bzoj2687 交与并(贪心+dp+决策单调性+分治)

    双倍经验:portal #include <cstdio> #include <cstring> #include <algorithm> #include < ...

  6. 【CF868F】Yet Another Minimization Problem (决策单调性优化dp+分治)

    description 点击查看题目 solution code 设dpi,jdp_{i,j}dpi,j​:把前iii个数划分jjj段的最小花费,wi,jw_{i,j}wi,j​:[i,j][i,j] ...

  7. [CodeForces1603D] Artistic Partition(四边形不等式 + 决策单调性优化dp + 分治 + 线性筛 + 数论分块)

    problem codeforces 对于给定的正整数 l≤l\leql≤,定义 c(l,r)c(l,r)c(l,r) 为满足下列条件的正整数对 (i,j)(i,j)(i,j) 的数量: l≤i≤j≤ ...

  8. 分羊(区间dp:分治与决策单调性优化)

    文章目录 题目描述 样例输入 样例输出 解析 代码 题目描述 给你一个数列,分成m段,每段的价值为相同数对的对数 求最小价值和 样例输入 10 2 1 2 1 2 1 2 1 2 1 2 样例输出 8 ...

  9. BZOJ2687 交与并/BZOJ2369 区间【决策单调性优化DP】【分治】

    Description 对于一个区间集合 {A1,A2--Ak}(K>1,Ai不等于Aj(i不等于J),定义其权值 S=|A1∪A2∪--AK|*|A1∩A2--∩Ak| 即它们的交区间的长度乘 ...

最新文章

  1. 【SQL Server】系统学习之三:逻辑查询处理阶段-六段式
  2. c语言中缺少link文件夹,c – Cmake找不到使用“link_directories”的库
  3. ActiveMQ中的温度,存储和内存使用百分比
  4. Apache Cassandra 1.1.0 稳定版发布
  5. 常识知识在AI不同领域应用的最新研究进展
  6. 【待补】Wireshark+BLE dongle: BLE数据包捕获以及分析
  7. python ocr 识别车牌_python 实现的车牌识别项目
  8. 【Unity3D】简单的鼠标打飞碟(Hit UFO)游戏
  9. 材料成型与控制专业和计算机专业,材料成型及控制工程专业
  10. 风力摆控制系统(B 题 本科组)-- 2015 年全国大学生电子设计竞赛试题
  11. ios12越狱自签需要联网_从越狱的iOS切换到Android? 这是你需要知道的
  12. C#将大量数据批量写入Excel中
  13. Win10外接显示器可以复制不可以扩展
  14. 微信网址打开php,微信打开网址添加在浏览器中打开提示
  15. 三菱PLC控制东芝4轴机器人程序,有完整的PLC程序带注释, 结构清楚,信捷触摸屏程序,电气图纸,东芝机械手程序,适合你学习应用,附赠东芝机器人编程软件,可以模拟运行。
  16. knex 找不到mysql_node knex mysql ER_NOT_SUPPORTED_AUTH_MODE
  17. SVN SERVER 安装
  18. python输出古诗词_python爬虫——爬取古诗词
  19. 极客爱情 2.2 | 程序员是这样撩妹的
  20. java文件下载接口_javaweb通过接口来实现多个文件压缩和下载(包括单文件下载,多文件批量下载)...

热门文章

  1. java求任意个数集合的笛卡尔积,Java中任意集的笛卡尔积
  2. android 如何判断h5页面是否加载完成_H5 键盘兼容性小结
  3. MySQL常见函数介绍
  4. SpringBoot底层注解-@ImportResource导入Spring配置文件
  5. TCP/IP的三层负载均衡
  6. Redis中的I/O 多路复用(I/O Multiplexing)
  7. Redis客户端命令行redis-cli操作
  8. 字符流写数据的5种方式
  9. 依赖注入_List_Set_Array类型的注入
  10. 使用response的outputstream