题意:
现在有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);
}

2105

被折叠的 条评论
为什么被折叠?



