有2N个矩形,这些矩形被标号为0 ~ 2N-1,对于第i个矩形其长宽分别为X[i]与Y[i]。现在要把这2N个矩形分为两组,每组N个,每个矩形恰好分到两组中的一组里。分成两组后,设两组分别为A组、B组,对于每一组矩形,你需要分别完成如下任务:
将该组中的N个矩形依次放在一个平面上,可以相互重叠,要求每个矩形的4条边都平行于平面坐标系的X轴或Y轴,矩形在摆放时可以旋转90度后再摆放。N个矩形摆放完后,使这N个矩形共同重叠的面积最大;设A组的最大面积为SA,B组的最大面积为SB。
请寻找一种恰当的分组方法,使SA+SB最大,并输出SA+SB的这个极值。
存在一组最优解,满足所有x>y的都被旋转了90度(即swap(x,y))。
考虑x最小和y最小的矩形,如果有多个任选一个。如果x,y同时最小,那么只需在剩余2n-1个矩形中选n个使面积交最大,否则分类这两个某一维最小的矩形是否在同一组,如果同组的话类似的只需在剩余2n-2个矩形中选n个使面积交最大,不同组则把剩余2n-2个等分成两组,使第一组x最大,第二组y最大。这三个过程很类似,都可以枚举一维的最值,另一维的最值用堆优化贪心确定。
#include<bits/stdc++.h>
const int N=,inf=0x3f3f3f3f;
typedef long long i64;
int n,pp,mx=inf,my=inf,sd=;
int min(int a,int b){return a<b?a:b;}
void mins(int&a,int b){if(a>b)a=b;}
void maxs(i64&a,i64 b){if(a<b)a=b;}
struct pos{
int x,y;
void R(){
scanf("%d%d",&x,&y);
if(x>y)std::swap(x,y);
mins(mx,x);mins(my,y);
}
bool operator<(const pos&w)const{return x<w.x;}
}ps[N],pmx,pmy;
struct cmpy1{bool operator()(const pos&a,const pos&b){return a.y>b.y;}};
struct cmpy2{bool operator()(const pos&a,const pos&b){return a.y<b.y;}};
i64 cal1(){
i64 s=;
if(!sd)sd=,std::sort(ps+,ps+pp+);
std::priority_queue<pos,std::vector<pos>,cmpy1>q;
for(int i=pp;i;--i){
q.push(ps[i]);
if(q.size()>n)q.pop();
if(q.size()==n)maxs(s,q.top().y*i64(ps[i].x));
}
return s+i64(mx)*my;
}
int ys[N];
i64 cal2(){
i64 s=;
if(!sd)sd=,std::sort(ps+,ps+pp+);
ys[]=inf;
int y0=pmx.y;
for(int i=;i<=pp;++i)ys[i]=ys[i-],mins(ys[i],ps[i].y);
std::priority_queue<pos,std::vector<pos>,cmpy2>q;
for(int i=pp;i;--i){
q.push(ps[i]);
if(q.size()>n-)mins(y0,q.top().y),q.pop();
if(q.size()==n-)maxs(s,i64(min(ps[i].x,pmy.x))*my+i64(min(ys[i-],y0))*mx);
}
return s;
}
int main(){
scanf("%d",&n);
pp=n*;
for(int i=;i<=pp;++i)ps[i].R();
for(int i=;i<=pp;++i)if(ps[i].x==mx){pmx=ps[i];ps[i]=ps[pp--];break;}
if(pmx.y==my)return printf("%lld",cal1()),;
for(int i=;i<=pp;++i)if(ps[i].y==my){pmy=ps[i];ps[i]=ps[pp--];break;}
return printf("%lld",std::max(cal1(),cal2())),;
}

51nod1302 矩形面积交的更多相关文章

  1. 2019计蒜之道初赛4 B. 腾讯益智小游戏—矩形面积交(简单)(矩形交集)

    B. 腾讯益智小游戏—矩形面积交(简单) 1000ms 262144K   腾讯游戏开发了一款全新的编程类益智小游戏,最新推出的一个小游戏题目是关于矩形面积交的.聪明的你能解出来吗?看下面的题目接招吧 ...

  2. HDU - 1255 覆盖的面积(线段树求矩形面积交 扫描线+离散化)

    链接:线段树求矩形面积并 扫描线+离散化 1.给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. 2.看完线段树求矩形面积并 的方法后,再看这题,求的是矩形面积交,类同. 求面积时,用被覆 ...

  3. C语言 · 矩形面积交

    问题描述 平面上有两个矩形,它们的边平行于直角坐标系的X轴或Y轴.对于每个矩形,我们给出它的一对相对顶点的坐标,请你编程算出两个矩形的交的面积. 输入格式 输入仅包含两行,每行描述一个矩形. 在每行中 ...

  4. Java实现 蓝桥杯VIP基础练习 矩形面积交

    描述 平面上有两个矩形,它们的边平行于直角坐标系的X轴或Y轴.对于每个矩形,我们给出它的一对相对顶点的坐标,请你编程算出两个矩形的交的面积. 输入 输入仅包含两行,每行描述一个矩形. 在每行中,给出矩 ...

  5. 2015 UESTC 数据结构专题E题 秋实大哥与家 线段树扫描线求矩形面积交

    E - 秋实大哥与家 Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/59 De ...

  6. 【hdu1255】线段树求矩形面积交

    题意大概就是上图这个样子.<=100组测试数据,每组<=1000个矩形. 题解: 这个问题怎么解决..做了上一题矩形面积并应该就会了.. 对于每个节点维护3个值: cnt:该节点所代表的这 ...

  7. Codeforces Round #524 (Div. 2)C 二维坐标系求俩矩形面积交

    题:https://codeforces.com/contest/1080/problem/C 题意:给n*m的二维坐标系,每个位置(xi,yi)都表示一个方格,(1,1)的位置是白色,整个坐标系黑白 ...

  8. Gym-100935I Farm 计算几何 圆和矩形面积交

    题面 题意:就是给你一个圆,和你一个矩形,求面积并,且 保证是一种情况:三角剖分后 一个点在圆内 两个在圆外 题解:可以直接上圆与凸多边形交的板子,也可以由这题实际情况,面积等于扇形减两个三角形 #i ...

  9. hdu1255(线段树——矩形面积交)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1255 题意:求N个矩形中,求被覆盖至少俩次的面积和 分析:覆盖两次即col[rt]>=2就好.一 ...

随机推荐

  1. MarkDown常用语法表

    MarkDown常用语法表 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 1 Title - 标题 2 H ...

  2. Gym 102091A: Flying Squirrel(RMQ)

    题意:如图,有N个柱子,每次我可以从高柱子X到低柱子Y,而且需要满足中间的柱子都小于X的高度. 思路:现在有Q次询问,每次给定(X,Y),(如果ht[X]<ht[Y],则交换XY),问X为起点, ...

  3. linux下使用小票打印

    linux下使用小票打印 打印机: Xprinter XP-58IIH指令支持: ESC/POS接口: USB, 蓝牙 Linux系统: Centos7 蓝牙配对很快, 配对好后就是连接状态. 但很快 ...

  4. oracle 日常

    oracle  sql server  select  1 from dual  和   select 1    nvl(null,0)     为空显示 0 greatest (1, 3, 2 )  ...

  5. 《DSP using MATLAB》Problem 5.24-5.25-5.26

    代码: function y = circonvt(x1,x2,N) %% N-point Circular convolution between x1 and x2: (time domain) ...

  6. LG3809 【模板】后缀排序

    题意 题目背景 这是一道模板题. 题目描述 读入一个长度为 $ n $ 的由大小写英文字母或数字组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符在原串中的 ...

  7. shell入门(二)——面试题实例

    [~/shell]$ cat one.sh #!/bin/bash path=/root/shell/test.txt if [ ! -f $path ] //检测文件是否存在,如果不存在,把内容改为 ...

  8. JQuery左右切换实现

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  9. RESTful Web API 理解

    REST 是一种应用架构风格,不是一种标准,是面向资源架构(ROA)风格,与具体技术平台无关,REST架构的应用未必建立在Web之上,与之对应的是传统的Web Service 采用的面向操作的RPC架 ...

  10. java程序源码

    //Account.java package pers.liqin.accounlist; public class Account { private String accountID; priva ...