首页 > 代码库 > [COCI 2013/2014 ROUND 6] graskrizja
[COCI 2013/2014 ROUND 6] graskrizja
分析:
这个题可以用分治的方法解决
先将所有的点按x坐标排序,以最中间的那个点的x坐标为轴,两边所有的点在轴上的对应的点加上,然后分别以同样的方法处理左右两个区间的点,递归处理下去知道区间只有一个点
下面是代码:
1 #include<cstdio> 2 #include<algorithm> 3 #define maxn 50100 4 using namespace std; 5 6 class Point 7 { 8 public: 9 int x,y;10 void get(){scanf("%d%d",&x,&y);}11 };12 13 int n;14 Point s[maxn];15 16 bool cmp(Point a,Point b)17 {18 if (a.x<b.x) return 1;19 if (a.x>b.x) return 0;20 if (a.y<b.y) return 1;21 return 0;22 }23 24 void Add_Point(int a,int b)25 {26 if (a>=b) return;27 int mid=(a+b)>>1;28 Add_Point(a,mid-1);29 Add_Point(mid+1,b);30 for (int i=a;i<=b;i++) if (s[mid].y!=s[i].y)31 printf("%d %d\n",s[mid].x,s[i].y);32 }33 34 int main()35 {36 scanf("%d",&n);37 for (int i=1;i<=n;i++) s[i].get();38 sort(s+1,s+1+n,cmp);39 Add_Point(1,n);40 return 0;41 }
[COCI 2013/2014 ROUND 6] graskrizja
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。