实际上就是个莫队的思想啊….. 哈夫曼距离就可以看作莫队时移动代价,然后就那样分块地排个序就好了。
过不了就稍微调一调块大小多试几次…
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=1000005;
int n,m,blk,_max;
struct data{
int x,y,id;
bool operator < (const data &b)const{
if(x/blk==b.x/blk) return y<b.y;
return x<b.x;
}
} a[maxn];
int main(){
freopen("cf576C.in","r",stdin);
freopen("cf576C.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d%d",&a[i].x,&a[i].y), a[i].id=i, _max=max(_max,max(a[i].x,a[i].y));
blk=1050; sort(a+1,a+1+n);
for(int i=1;i<=n;i++) printf("%d ",a[i].id);
return 0;
}