在一个边长为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;
}