题意:给你一个无限大矩形中有一些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. 移动端自动化测试appium 从入门到项目实战Python版✍✍✍

    移动端自动化测试appium 从入门到项目实战Python版 整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课程 ...

  2. style优先级

    不同级别 在属性后面使用 !important 会覆盖页面内任何位置定义的元素样式. 作为style属性写在元素内的样式 id选择器 类选择器 标签选择器 通配符选择器 浏览器自定义或继承       ...

  3. 18_ShadowWalker

    白皮书中 page-fault error code: shadowWalker 原理: 接管 指定程序 的 执行页面异常.读写页面异常:然后 调用一下正常的 使其出现在快表:然后恢复到假的pte - ...

  4. WordPress建站要怎样选择适合自己的主机

    目前很多大中小的网站都在使用WordPress进行建站,因为互联网站长都知道WordPress建站是很方便的,简洁的界面,栅格化管理风格,深受互联网站长的喜爱. 现在支持WordPress建站的主机商 ...

  5. 文档 所有空格变为Tab

    遗憾的是记事本.word没有这个功能... 可以生成exe #include <cstdio> #include <cstdlib> #include <cmath> ...

  6. 使用vue-cli 脚手架快速搭建单页面组件 -------webpack工具的介绍

    在使用vue-cli时我们先了解一下什么是webpack. Webpack 是当下最热门的前端资源模块化管理和打包工具.它可以将许多松散的模块按照依赖和规则打包成符合生产环境部署的前端资源.还可以将按 ...

  7. Kafka Streams详细

    概述 1 Kafka Streams Kafka Streams.Apache Kafka开源项目的一个组成部分.是一个功能强大,易于使用的库.用于在Kafka上构建高可分布式.拓展性,容错的应用程序 ...

  8. NX二次开发-设置尺寸的附加尺寸UF_DRF_set_appended_text

    #include <uf.h> #include <uf_drf.h> #include <uf_obj.h> #include <uf_part.h> ...

  9. go语言type使用小技巧

    import "fmt" type Rank int const ( Rank001 Rank = iota Rank002 Rank003 Rank004 ) var rewar ...

  10. Java-Class-FC:java.nio.charset.StandardCharsets

    ylbtech-Java-Class-FC:java.nio.charset.StandardCharsets 1.返回顶部   2.返回顶部 1.1.import java.nio.charset. ...