A set of points on a plane is called good, if for any two points at least one of the three conditions is true:

  • those two points lie on same horizontal line;
  • those two points lie on same vertical line;
  • the rectangle, with corners in these two points, contains inside or on its borders at least one point of the set, other than these two. We mean here a rectangle with sides parallel to coordinates' axes, the so-called bounding box of the two points.

You are given a set consisting of n points on a plane. Find any good superset of the given set whose size would not exceed 2·105 points.

Input

The first line contains an integer n (1 ≤ n ≤ 104) — the number of points in the initial set. Next n lines describe the set's points. Each line contains two integers xi and yi ( - 109 ≤ xi, yi ≤ 109) — a corresponding point's coordinates. It is guaranteed that all the points are different.

Output

Print on the first line the number of points m (n ≤ m ≤ 2·105) in a good superset, print on next m lines the points. The absolute value of the points' coordinates should not exceed 109. Note that you should not minimize m, it is enough to find any good superset of the given set, whose size does not exceed 2·105.

All points in the superset should have integer coordinates.

Example

Input
2
1 1
2 2
Output
3
1 1
2 2
1 2
大致题意:给定一些点,要求添加一些点,使得任意一对点满足三个条件之一即可:1.横坐标相同.2.纵坐标相同.3.两个点围成的矩形内部或边上有其他的点.
分析:构造题,看到平面上分布着一些点,想到了平面上的分治.常见的方法是取中间点为中轴,左右两边分治.关键是两边的答案不好合并.
一开始的想法是枚举位于左边的点再枚举位于右边的点,如果两个点之间没有其它点,就必须在另外两个拐角之一放一个点,这样还要分类讨论,而且枚举的复杂度高,不是很好.在网上看到了其他人的构造方法,非常巧妙:以中间的点的所在的竖线为中轴,其他所有点向中轴投影,投影的点即为要添加的点.这样既满足了矩形内部有点的性质,又使得新添加的点全部在一条直线上,不用再对新添加的点来继续讨论.感觉平面上的分治都和中轴有关,以后这类问题要多往这个方向上想.
最后要去重,点数可能比10w要多,数组要开大一点.
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; struct node
{
int x,y;
}e[],ans[],print[]; int n,cnt,tot; bool cmp(node a,node b)
{
if (a.x == b.x)
return a.y < b.y;
return a.x < b.x;
} void solve(int l,int r)
{
if (l == r)
ans[++cnt] = e[l];
if (l >= r)
return;
int mid = (l + r) >> ;
solve(l,mid - );
solve(mid + ,r);
for (int i = l; i <= r; i++)
{
node temp;
temp.x = e[mid].x;
temp.y = e[i].y;
ans[++cnt] = temp;
}
} int main()
{
scanf("%d",&n);
for (int i = ; i <= n; i++)
scanf("%d%d",&e[i].x,&e[i].y);
sort(e + ,e + + n,cmp);
solve(,n);
sort(ans + ,ans + + cnt,cmp);
print[++tot] = ans[];
for (int i = ; i <= cnt; i++)
if (ans[i].x != ans[i - ].x || ans[i].y != ans[i - ].y)
print[++tot] = ans[i];
printf("%d\n",tot);
for (int i = ; i <= tot; i++)
printf("%d %d\n",print[i].x,print[i].y); return ;
}
 

Codeforces 97.B Superset的更多相关文章

  1. CodeForces 97 E. Leaders(点双连通分量 + 倍增)

    题意 给你一个有 \(n\) 个点 \(m\) 条边的无向图,有 \(q\) 次询问,每次询问两个点 \(u, v\) 之间是否存在长度为奇数的简单路径. \(1 \le n, m, q \le 10 ...

  2. codeforces 97 div2 C.Replacement 水题

    C. Replacement time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...

  3. Codeforces Beta Round #97 (Div. 1) C. Zero-One 数学

    C. Zero-One 题目连接: http://codeforces.com/contest/135/problem/C Description Little Petya very much lik ...

  4. Codeforces Beta Round #97 (Div. 1) B. Rectangle and Square 暴力

    B. Rectangle and Square 题目连接: http://codeforces.com/contest/135/problem/B Description Little Petya v ...

  5. Codeforces Beta Round #97 (Div. 1) A. Replacement 水题

    A. Replacement 题目连接: http://codeforces.com/contest/135/problem/A Description Little Petya very much ...

  6. 【57.97%】【codeforces Round #380A】Interview with Oleg

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  7. Educational Codeforces Round 97 (Rated for Div. 2) E. Make It Increasing(最长非下降子序列)

    题目链接:https://codeforces.com/contest/1437/problem/E 题意 给出一个大小为 \(n\) 的数组 \(a\) 和一个下标数组 \(b\),每次操作可以选择 ...

  8. Educational Codeforces Round 97 (Rated for Div. 2)【ABCD】

    比赛链接:https://codeforces.com/contest/1437 A. Marketing Scheme 题解 令 \(l = \frac{a}{2}\),那么如果 \(r < ...

  9. Codeforces Beta Round #97 (Div. 1)

    B 判矩阵的时候 出了点错 根据点积判垂直 叉积判平行 面积不能为0 #include <iostream> #include<cstdio> #include<cstr ...

随机推荐

  1. 启动tomcat时 一闪而过解决方法(2)

    下面我先跟大家确认一下问题出现的前提条件(本机版本java:1.6.20,tomcat:6.0.32) 1)在eclipse里面启动tomcat时都是正常的. 2)在系统中配置了各种环境变量如下: J ...

  2. python3【基础】-装饰器

    要理解充分理解python的装饰器,有充分理解下述三个知识点为前提: python作用域规则 函数即对象 闭包 一.python作用域规则: 首先介绍python中的作用域规则.python的作用域规 ...

  3. ES6的新特性(15)——Promise 对象

    Promise 对象 Promise 的含义 Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大.它由社区最早提出和实现,ES6 将其写进了语言标准,统一了 ...

  4. 雅虎工程师提供的CSS初始化示例代码

    body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,button,textarea,p,b ...

  5. “取件帮”微信小程序宣传视频链接及内容介绍

    1.视频链接 视频上传至优酷自频道,地址链接:http://v.youku.com/v_show/id_XMzg2NTM3OTc5Ng==.html?spm=a2hzp.8253869.0.0 2.视 ...

  6. 冲刺阶段站立会议每日任务i4

    昨天对小组成员的任务进行了进一步细化分配,今天了解了安卓开发环境的相关知识. 遇到的问题: 没有遇到问题.

  7. tensorflow之分类学习

    写在前面的话 MNIST教程是tensorflow中文社区的第一课,例程即训练一个 手写数字识别 模型:http://www.tensorfly.cn/tfdoc/tutorials/mnist_be ...

  8. UIView maskView属性

    给View1的maskView 赋值View2 1.View2不会显示在View1上: 2.View2 的alpha通道会体现在View1上. 关于maskView,Apple的解释: An opti ...

  9. FormsAuthentication.SetAuthCookie 方法登录

    FormsAuthentication.SetAuthCookie 方法,登录的原理. FormsAuthentication.SetAuthCookie 方法登录的过期时间. 登录相关阅读 asp. ...

  10. Android 8悬浮窗适配

    背景 APP推出时,提示是退出还是更改账号,这个提示框是系统级别的.然而我的Android 9 会崩溃,宁外一个小伙伴Android 7运行理想.报错提示permission denied for w ...