在一个边长为10^6正方形中,可以把它x轴分段,分成1000段。奇数的时候由底往上扫描,偶数的时候由上往下扫描。估计一下这个最长的长度,首先,我们知道有10^6个点,则y邮方向最多移动10^3*10^6。对于x轴方向,如果都在一个段内,则最多移动 10^3*10^6,如果均不在一个段内,最多就2000*10^3。比限制长度肯定要小。
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; struct Point{ int x,y,i; Point(){}; Point (int xx,int yy,int ii){ x=xx;y=yy;i=ii; } }p[1000005]; bool cmp(Point a,Point b){ if(a.x/1000==b.x/1000){ if(a.x/1000%2==0){ if(a.y<b.y) return true; return false; } else{ if(a.y>b.y) return true; return false; } } else{ if(a.x<b.x) return true; return false; } } int main(){ int n; while(scanf("%d",&n)!=EOF){ for(int i=0;i<n;i++){ scanf("%d%d",&p[i].x,&p[i].y); p[i].i=i+1; } sort(p,p+n,cmp); printf("%d",p[0].i); for(int i=1;i<n;i++) printf(" %d",p[i].i); puts(""); } return 0; }