题意:给你一个无限大矩形中有一些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. 调用API接口,查询手机号码归属地(3)

    从mysql数据库获取电话号码,查询归属地并插入到数据库 #!/usr/bin/python # -*- coding: utf-8 -*- import json, urllib, sys, pym ...

  2. 并发编程之CAS(二)

    更多Android架构进阶视频学习请点击:https://space.bilibili.com/474380680本篇文章将从以下几个内容来阐述CAS: [CAS原理] [CAS带来的ABA问题] 一 ...

  3. elementUI+JS实现全选与反选

    在实际项目开发过程中,遇到的需求,需要实现全选以及取消全选等功能,主要使用ElementUI + JS来实现,具体代码如下: <!DOCTYPE html> <html lang=& ...

  4. 基于 CI 1.7.x 的 项目使用新版本CI的文件缓存类库

    维护的项目使用的是 codeigniter 1.7.x版本,但是我想使用文件缓存,但是旧版本是没有缓存类库的,并且autoload.php没有drivers这个配置项. 我复制的是 Codeignit ...

  5. 微信小程序之自定义组件

    在微信小程序项目中 肯定会存在很多功能和样式上相似的部分 面对这种情况 只是单单的ctrl+c ctrl+v 就显得很low了,而且也不便于后期维护那么这时候 使用微信小程序中的自定义组件功能就很合适 ...

  6. C/C++各个周期的学习

    C/C++ 程序的生命周期 编写时: 要点:业务,数据结构,控制解耦:健壮:易修改:清晰简单无歧义:易重用:低耦合高内聚:易链接:速度快(时间复杂度,空间复杂度,cache友好): 书籍:<c+ ...

  7. leetcode-399-除法求值

    方法一:dfs+图 class Solution: def calcEquation(self, equations: List[List[str]], values: List[float], qu ...

  8. vim 详解

    Vim是一个功能强大的全屏幕文本编辑器,是Linux/UNIX上最常用的文本编辑器. 它的作用是建立.编辑.显示文本文件. Vim的几种模式 正常模式: 可以使用快捷键命令,或按:输入命令行. 插入模 ...

  9. HTML+CSS项目——模拟京东网页

    项目准备 项目名称:京东商城 项目描述:京东首页公共部分的头部和尾部制作,京东首页中间部分. 设计目标 保证浏览器 ie7及以上, 火狐, 360, safari,chrome等.谁让我再测ie6,就 ...

  10. mysql 删除同样记录只保留一条

    delete from fa_order_account ) as a) ) as b)