题意:
现在有1e6个点,(0= < x,y<=1e6),对他们进行排序,使得所有相邻两个点的曼哈顿距离之和小于2.5e9
思路:
用类似莫队那样的分块, n?√ 进行分块,这样相邻x最多为 (√n) ,一共n个x,距离和为 nn?√ ,对于y,每个块移动n,共 n?√ 个块,所以总和还是 nn?√ ,但是需要注意一个地方,如果就是最初始的莫队,会导致总体和为 3nn?√ ,所以我们对于偶数的块上升,奇数的块下降,这样总体和就是 nn?√ 了
错误及反思:
一开始没考虑到y会出现的问题。。。
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1000010;
struct poi
{int x,y,id;
}P[N];
int pos[N],n;
bool cmp(poi w,poi e)
{if(pos[w.x]==pos[e.x]){if(pos[w.x]%2==0)return w.y<e.y;else return w.y>e.y;}return w.x<e.x;
}
int main(){scanf("%d",&n);int block=(int)sqrt(1000000);for(int i=0;i<n;i++){scanf("%d%d",&P[i].x,&P[i].y);P[i].id=i+1;}for(int i=0;i<=1000000;i++)pos[i]=i/block;sort(P,P+n,cmp);for(int i=0;i<n;i++)printf("%d ",P[i].id);
}