CF576C Points on Plane

牛逼套路

看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;
}

我钛菜了,菜就多练

posted @ 2024-07-02 20:26  dolphina  阅读(1)  评论(0编辑  收藏  举报