题意:给你一个无限大矩形中有一些planet,每次可以选择某一没有planet的行或列分割开矩形(分割开以后要求矩形不为空)。问最后能分割成几个矩形?

标程:

 #include<bits/stdc++.h>
#define P pair<int,int>
#define fir first
#define sec second
using namespace std;
const int N=;
set<P> X,Y;
int n,x[N],y[N];
int solve(set<P> &a,set<P> &b)//要加&符号,不然set不能覆盖
{//注意a.rbegin()不能作为指针,只能求值如a.rbegin()->fir
set<P> ::iterator ta1=a.begin(),ta2=--a.end(),tb1=b.begin(),tb2=--b.end(),nxt,t,ed1,ed2;
while (*ta1<=*ta2||*tb1<=*tb2)
{
assert(!a.empty());
if (ta1!=--a.end())
{
nxt=++ta1;--ta1;
set<P> aa,bb;//定义在内部,如果在定义在外面clear的时候地址会错误
if (ta1->fir+<nxt->fir){
for (t=a.begin();t!=nxt;)
{
int u=t->sec;++t;//在没有删除元素之前移动指针,不然会寻不到地址
aa.insert(P(x[u],u)),bb.insert(P(y[u],u)),b.erase(P(y[u],u)),a.erase(P(x[u],u));//如果不另储的话,*t移除放在最后
}
return solve(aa,bb)+solve(a,b);
}
}
if (ta2!=a.begin())
{
nxt=--ta2;++ta2;
set<P> aa,bb;
if (ta2->fir->nxt->fir){
for (t=--a.end();t!=nxt;)
{
int u=t->sec;--t;
aa.insert(P(x[u],u)),bb.insert(P(y[u],u)),b.erase(P(y[u],u)),a.erase(P(x[u],u));
}
return solve(aa,bb)+solve(a,b);
}
}
if (tb1!=--b.end())
{
nxt=++tb1;--tb1;
set<P> aa,bb;
if (tb1->fir+<nxt->fir){
for (t=b.begin();t!=nxt;)
{
int u=t->sec;++t;
aa.insert(P(x[u],u)),bb.insert(P(y[u],u)),b.erase(P(y[u],u)),a.erase(P(x[u],u));
}
return solve(aa,bb)+solve(a,b);
}
}
if (tb2!=b.begin())
{
nxt=--tb2;++tb2;
set<P> aa,bb;
if (tb2->fir->nxt->fir){
for (t=--b.end();t!=nxt;)
{
int u=t->sec;--t;
aa.insert(P(x[u],u)),bb.insert(P(y[u],u)),b.erase(P(y[u],u)),a.erase(P(x[u],u));
}
return solve(aa,bb)+solve(a,b);
}
}
ed1=--a.end(),ed2=--b.end();
if (ta1==ed1&&tb1==ed2) break;
if (ta1!=ed1) ++ta1,--ta2;
if (tb1!=ed2) ++tb1,--tb2;
}
return ;
}
int main()
{
scanf("%d",&n);
for (int i=;i<=n;i++)
{
scanf("%d%d",&x[i],&y[i]);
X.insert(P(x[i],i));Y.insert(P(y[i],i));
}
printf("%d\n",solve(X,Y));
return ;
}

易错点:set操作注意一下。

题解:set+启发式分割

将所有的planet存入行set和列set。

每次从行和列的两边(启发式)往中间找空行/列,然后剖开,递归求解子问题。

时间复杂度O((n+m)log(n+m))。

CF475F meta-universe的更多相关文章

  1. meta 标签的作用

    META标签,是HTML语言HEAD区的一个辅助性标签.在几乎所有的page里,我们都可以看到类似下面这段htm l代码: <head> <meta http-equiv=" ...

  2. META标签的NAME变量

    META标签的NAME变量语法格式是: <META NAME=xxx CONTENT=xxxxxxxxxxxxxxxxxx> 其中xxx主要有下面几种参数: 1. Keywords(关键字 ...

  3. meta 标签 关键字 用处

    您的个人网站即使做得再精彩,在“浩瀚如海”的网络空间中,也如一叶扁舟不易为人发现,如何推广个人网站, 人们首先想到的方法无外乎以下几种: l 在搜索引擎中登录自己的个人网站 l 在知名网站加入你个人网 ...

  4. meta是什么意思?

    META标签,是HTML语言head区的一个辅助性标签.在几乎所有的page里,我们都可以看 到类似下面这段html代码: -------------------------------------- ...

  5. meta的用法

    META标签,是HTML语言head区的一个辅助性标签.在几乎所有的page里,我们都可以看 到类似下面这段html代码: -------------------------------------- ...

  6. HTML中的Meta标签详解

    emta标签的组成:meta标签分两大部分:HTTP-EQUIV和NAME变量. HTTP-EQUIV:HTTP-EQUIV类似于HTTP的头部协议,它回应给浏览器一些有用的信息,以帮助正确和精确地显 ...

  7. 关于META你知道多少

    META标签,是HTML语言head区的一个辅助性标签.在几乎所有的page里,我们都可以看 到类似下面这段html代码: -------------------------------------- ...

  8. html meta标签使用

    HTML语言标准注释:meta标签是对网站发展非常重要的标签,它可以用于鉴别作者,设定页面格式,标注内容提要和关键字,以及刷新页面等等. Google在2009年就宣布在搜索算法中不再使用元关键词或者 ...

  9. 常用 meta 整理

    <!-- 针对手持设备优化,主要是针对一些老的不识别viewport的浏览器,比如黑莓 --> <meta name="HandheldFriendly" con ...

  10. meta标签

    参考:http://www.jb51.net/web/158860.html META标签分两大部分:HTTP标题信息(HTTP-EQUIV)和页面描述信息(NAME). 一.HTTP标题信息(HTT ...

随机推荐

  1. Struts2入门示例(Myeclipse)

    1.新建Web项目在lib导入struts-2.3.37核心基础jar包 2.在WebRoot新建2个JSP demo1.jsp <%@ page language="java&quo ...

  2. PCA降维-最大,最小方差解释

    转自http://www.cnblogs.com/jerrylead/archive/2011/04/18/2020209.html http://www.cnblogs.com/jerrylead/ ...

  3. mac下Python安装路径的说明

    Python安装路径的说明 mac在安装Python时, 对不同的安装方式 不同的型号均会安装在不同的文件夹下 安装方式 路径 系统默认(2.7) /System/Library/Frameworks ...

  4. AF_UNIX

    3.SOCK_SEQPACKET SOCK_SEQPACKET提供一个顺序确定的,可靠的,双向基于连接的socket endpoint. 与SOCK_STREAM不同的是,它保留消息边界.(表明发送两 ...

  5. js查询字符串是否包含指定字符的函数indexOf

    今天用到了js的函数indexOf来查看字符串中是否包含指定的字符,最开始没注意看,就拿来用了,结果用的时候才发现,IndexOf的返回值原来是字符在字符串中的index,返回值有0.1等等,如果没有 ...

  6. sqlmap结合burpsuite对post请求进行注入测试

    1. 浏览器打开目标地址 http://testasp.vulnweb.com/Login.asp 2. 配置burp代理(127.0.0.1:8080)以拦截请求 3. 点击login表单的subm ...

  7. SpringBoot中使用Scheduling执行定时任务

    SpringBoot自带的 Schedule,可以将它看成一个轻量级的Quartz,而且使用起来比Quartz简单许多 以下任务都是在单线程下执行的 第一步 创建SpringBoot项目 第二步 外汇 ...

  8. leetcode-第11场双周赛-5089-安排会议日程

    题目描述: 自己的提交: class Solution: def minAvailableDuration(self, slots1: List[List[int]], slots2: List[Li ...

  9. leetcood学习笔记-235-二叉搜索树的最近公共祖先

    题目描述: 利用二叉搜索树的特点,如果p.q的值都小于root,说明p q 肯定在root的左子树中:如果p q都大于root,说明肯定在root的右子树中,如果一个在左一个在右 则说明此时的root ...

  10. php注册和登陆与数据库的链接

    注册和登陆其实是从一个表中进行提取和写入数据 1.(1)先建立一个注册页面 1 2 3 4 5 6 7 8 9 <body>         <h1>注册页面</h1&g ...