CodeForces 97B Superset (分治)

来源:互联网 发布:企政oa软件 编辑:程序博客网 时间:2024/06/04 17:56

题意:

给出n对坐标,可以在其中添加一些点,使得平面上任意两点满足以下三个条件的其中一个

1、两个点在同一水平面上

2、两个点在同一竖线上

3、这两个点所围成的矩形里面有点存在

最后输出满足条件的点的总数,并输出这些点

 

先排序,再解题

 

#include <iostream>#include <cstdio>#include <cstring>#include <string>#include <set>#include <algorithm>using namespace std;struct node{int x,y;bool operator <(const node b)const{if(x==b.x) return y<b.y;else return x<b.x;}//写了这个,sort里面不用写cmp了,正常写 };node a[10005];set<node>s;set<node>::iterator it;void dfs(int l,int h){if(l==h) return;int mid = (l+h)/2;for(int i=l;i<=h;i++){node ret;ret.x = a[mid].x;ret.y = a[i].y;s.insert(ret);}dfs(l,mid);dfs(mid+1,h);}int main(){int n;cin>>n;s.clear();for(int i=0;i<n;i++){cin>>a[i].x>>a[i].y;s.insert(a[i]);}sort(a,a+n);dfs(0,n-1);int t = s.size();cout<<t<<endl;for(it = s.begin();it!=s.end();it++){cout<<it->x<<" "<<it->y<<endl;}return 0;}


 

0 0
原创粉丝点击