Codeforces Round #319 (Div. 2) E

题目大意:在一个平面里有n个点,点坐标的值在1-1e6之间,让你给出一个遍历所有点的顺序,要求每个点走一次,且

曼哈顿距离之和小于25*1e8。

思路:想了一会就有了思路,我们可以把1e6的x,y坐标都分成2000份,每份500,然后这样整个平面就被分成

了2000*2000个区域,然后按区域输出点就行了。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n;
 4 vector<int> ans[2005][2005];
 5 int main()
 6 {
 7     scanf("%d",&n);
 8     for(int i=1;i<=n;i++)
 9     {
10         int x,y; scanf("%d%d",&x,&y);
11         ans[x/500][y/500].push_back(i);
12     }
13     bool flag=false;
14     for(int i=0;i<=2004;i++)
15     {
16         if(!flag)
17         {
18             for(int j=0;j<=2004;j++)
19             {
20                 for(int k:ans[i][j]) printf("%d ",k);
21             }
22         }
23         else
24         {
25             for(int j=2004;j>=0;j--)
26             {
27                 for(int k:ans[i][j]) printf("%d ",k);
28             }
29         }
30         flag=!flag;
31     }
32     return 0;
33 }
View Code
原文地址:https://www.cnblogs.com/CJLHY/p/8044671.html