实际上就是个莫队的思想啊….. 哈夫曼距离就可以看作莫队时移动代价,然后就那样分块地排个序就好了。
过不了就稍微调一调块大小多试几次…
#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;
}

本文介绍了一种利用莫队思想解决特定问题的方法,将哈夫曼距离作为移动代价,并通过分块排序来优化算法效率。文章提供了一个具体的实现示例。
617

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



