牛逼套路
看inf眼都不会,看眼题解就会了(bushi
题目让我们求一堆点按某种顺序排列后相邻点曼哈顿距离总和小于等于\(2.5\times10^9\)
然后很牛的东西:把坐标\((x,y)\)当作区间\((l,r)\),那欲求式就等于每一个区间的\((l_1,r_1)\)移到另一个相邻区间的\((l2,r2)\)的步数的总和了,于是很像莫队算法的精髓:通过排序来使得移动区间的步数最小,因为莫队区间移动是\(n\sqrt{n}\)级别的,小于等于\(10^9\),于是我们就可以通过莫队区间的排序来算出顺序了
#include<bits/stdc++.h>
#define vd void
int gi(){
char c;int x=0,f=0;
while(!isdigit(c=getchar()))f|=(c=='-');
while(isdigit(c))x=(x*10)+(c^48),c=getchar();
return f?-x:x;
}
struct Q{
int l,r,id;
}q[1000005];
int n,len;
int main(){
n=gi();len=sqrt(n);
for(int i=1;i<=n;i++)q[i].l=gi(),q[i].r=gi(),q[i].id=i;
std::sort(q+1,q+n+1,[&](Q a,Q b){if(a.l/len!=b.l/len)return a.l<b.l;return ((a.l/len)&1)?a.r<b.r:a.r>b.r;});
for(int i=1;i<=n;i++)printf("%d ",q[i].id);
puts("");
return 0;
}
我钛菜了,菜就多练