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. 1.6 JAVA高并发之线程池

    一.JAVA高级并发 1.5JDK之后引入高级并发特性,大多数的特性在java.util.concurrent 包中,是专门用于多线程发编程的,充分利用了现代多处理器和多核心系统的功能以编写大规模并发 ...

  2. http 502 bad gate way

    世界杯期间,公司的cdn在回源时突然出现大量502. 刚出现问题时,因为考虑到一般502都是上游服务器出现问题,然后因为已经服务了很久都没有出现过这种问题, 就没有仔细考虑,就让回源中心的同事进行排查 ...

  3. 印度电商Snapdeal获投$1.34亿 eBay领投

    据消息人士透露,eBay领投1.337亿美元,投资印度最大在线购物网站Snapdeal,最终或有可能全权收购该网站.据悉,在此次投资中,大部分资金来自eBay. 今年1月,曾有报道称,Snapdeal ...

  4. 实现属于自己的TensorFlow(二) - 梯度计算与反向传播

    前言 上一篇中介绍了计算图以及前向传播的实现,本文中将主要介绍对于模型优化非常重要的反向传播算法以及反向传播算法中梯度计算的实现.因为在计算梯度的时候需要涉及到矩阵梯度的计算,本文针对几种常用操作的梯 ...

  5. Python:字符串操作总结

    所有标准的序列操作(索引.分片.乘法.判断成员资格.求长度.取最小值最大值)对字符串同样适用,且字符串是不可变的. 一.字符串格式化 转换说明符 [注]: 这些项的顺序至关重要 (1)%字符:标记转换 ...

  6. 博弈---威佐夫博奕(Wythoff Game)

    这个写的不错 威佐夫博奕(Wythoff Game):有两堆各若干个物品,两个人轮流从某一堆或同 时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜.     这种情况下是颇为复杂 ...

  7. DS06--图

    一.学习总结 1.图的思维导图 2.图学习体会 深度优先遍历与广度优先遍历 不同点:广度优先搜索,适用于所有情况下的搜索,但是深度优先搜索不一定能适用于所有情况下的搜索.因为由于一个有解的问题树可能含 ...

  8. 0325 实验一操作系统模拟cmd

    实验一.命令解释程序的编写 专业:商软(2)班   姓名:韩麒麟 学号:201406114253 一. 实验目的 (1)掌握命令解释程序的原理: (2)掌握简单的DOS调用方法: (3)掌握C语言编程 ...

  9. (转)微软借力.NET开源跨平台支持,布局物联网平台开发

    今天科技类最大的新闻,莫过于微软宣布.NET开发框架开源计划..NET 开源,集成 Clang 和 LLVM 并且自带 Android 模拟器,这意味着 Visual Studio 这个当下最好没有之 ...

  10. C#获取当前路径的方法如下

    1. System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName -获取模块的完整路径. 2. System.Environm ...